版权声明:本文为博主原创文章,未经博主允许不得转载 https://blog.csdn.net/LyueP/article/details/88356815
项目中要实现一个opencv 实现,需要用到openCv-sdk中的.so文件,就想先配置一下环境,实现过程中遇到的问题列出来 有需要的朋有可以一块讨论
关于android中有关JNI无法生成.so文件的问题解决方法
听说最近流行"云玩家"这个词 今天好像要在我身上实践了 , 本来看视频上有介绍NDK开发的入门视频介绍如何搭建环境的,还挺简单,凭借我聪明的大脑 怎么着也会个7-8成吧! 在我洋洋得意的时候,现实就给了我一闷棍.闲话不多说了 咱们来处理问题吧。
1 配置NDK
1:在File | Settings | Appearance & Behavior | System Settings | Android SDK | SDK Tools 选择NDK,点击下载 如图:

2 然后导入下载NDK的路径 如下图:
2 代码部分
1.新建一个NDKUtil.java类
public class NDKUtil {
//创建native方法
public native String SaySometing();
//静态代码块加载动态库(moduleName)
static {
//字符串内名字需要跟下文中Android.mk文件LOCAL_MODULE := NDKdemo,的NDKdemo一致.
System.loadLibrary("NDKdemo");
}
2 点击Buile->Make Module 会在\app\build\intermediates\classes\debug\lyp\com\生成NDKUtil.class文件

- 下一步生成**.h头文件**文件 直接按住debug文件拖到命令行,自动生成debug所在路径输入以下命令
javah -jni lyp.com.ndkmodeo.NDKUtil //根据自己项目的包名+类名修改

- 在main目录下 新建jni文件夹 将生成的.h头文件 拷贝到jni下 (直接新建package命名jni也可) 如图

5 然后在jni文件下新建HelloJNI.c文件 并将lyp_com_ndkmodeo_NDKUtil.h文件下的在方法拷贝到创建好的HelloJNI.c文件下
JNIEXPORT jstring JNICALL Java_lyp_com_ndkmodeo_NDKUtil_SaySometing (JNIEnv *, jobject);
如下图 :

在HelloJNI.c中将方法补充完整,注意标注的部分 根据自己的包名+ 类名 + 方法名设置;

在jni文件下新建file文件 命名为Android.mk 内容;
LOCAL_PATH:=$(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := NDKdemo // 对应自己的动态库名字 LOCAL_SRC_FILES := HelloJNI.c //对应自己的.c文件 include $(BUILD_SHARED_LIBRARY)在jni文件下新建file文件 命名为Application.mk;内容:
App_ABI:=all
APP_PLATFORM := android-14
- 在buile.gradle 的Android目录下 添加如下代码::
android{
sourceSets{
main{
jniLibs.srcDirs=['libs']
}
}
10:在gradle.properties添加代码android.useDeprecatedNdk=true
11 然后就是重点的生成.so文件的部分 把当前module的main路径拷贝到控制台(AS内部的控制台) 通过 ndk-build 生成.so文件 如下图。
12 最后的项目文件结构如下
最后在MainActivity方法中输出一下

需要注意的是
在项目中已经有一个NDKdemo的情况或者在新建module重复上述操作的下 在生成.so文件的时候需要 右击Android.mk关联已存在的C++库, 把Android.mk的文件路径拷贝到选框中 把Cmake 改成 ndk-build 就可以了
Error:Execution failed for task ':ndkdemo:compileDebugNdk'.
> Error: Your project contains C++ files but it is not using a supported native build system.
Consider using CMake or ndk-build integration. For more information, go to:
https://d.android.com/r/studio-ui/add-native-code.html
Alternatively, you can use the experimental plugin:
https://developer.android.com/r/tools/experimental-plugin.html



如果有提示报错包含android.deprecatedNdkComplieLease = 1552032970677 就把 android.deprecatedNdkComplieLease = 1552032970677 //***根据自己项目报错查看对应数值 别粘贴这个*** 注意注意注意
拷贝到gradle.properties 文件下
Error:Execution failed for task ':ndkdemo:compileDebugNdk'.
> Error: Flag android.useDeprecatedNdk is no longer supported and will be removed in the next version of Android Studio. Please switch to a supported build system.
Consider using CMake or ndk-build integration. For more information, go to:
https://d.android.com/r/studio-ui/add-native-code.html#ndkCompile
To get started, you can use the sample ndk-build script the Android
plugin generated for you at:
D:\JNITest\ndkdemo\build\intermediates\ndk\debug\Android.mk
Alternatively, you can use the experimental plugin:
https://developer.android.com/r/tools/experimental-plugin.html
To continue using the deprecated NDK compile for another 60 days, set
android.deprecatedNdkCompileLease=1552269471095 in gradle.properties //


先写到这里 如果有问题 欢迎讨论