关于android中有关JNI无法生成.so文件的问题解决方法

版权声明:本文为博主原创文章,未经博主允许不得转载 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文件
在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述

  1. 在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);

如下图 :

在这里插入图片描述

  1. 在HelloJNI.c中将方法补充完整,注意标注的部分 根据自己的包名+ 类名 + 方法名设置;
    在这里插入图片描述

  2. 在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)
    
  3. 在jni文件下新建file文件 命名为Application.mk;内容:

		App_ABI:=all

		APP_PLATFORM := android-14 
  1. 在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  //

在这里插入图片描述
在这里插入图片描述
先写到这里 如果有问题 欢迎讨论

Github项目地址


版权声明:本文为LyueP原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。