距离上一篇博客已经过去20天了.......不知是事情太多,还是太懒了,学习到了很多,总感觉没时间写成博客,却有时间发呆,看新闻.............唉
废话不多说,开始总结!!!
1什么是JNI
JNI是Java Native Interface的缩写 , 后面具体的解释也懒得贴上来 , 我理解的就是Java调用c或者c++代码 。
2准备工作
在用之前 你的Android Studio 必须先安装NDK 具体步骤自行百度(Android Studio 里面自带的) 来个图
File - Settings - Appearance & Behavior - SystemsSetting - Android SDK - SDK Tool - ndk 然后安装就行 , 我安装的时候不知道是网的原因还是电脑配置的原因 奇慢无比
经过漫长的等待之后 安装完成 , 不过!!别忘了配置环境 下图
变量值是ndk的路径
还有一个需要添加的就是 Path 的变量值 需要在后面新增 %NDK_ROOT% ;
- 其实你定义的变量名字是什么都无所谓,只要保证path中包含ndk的安装路径即可。定义环境变量的意义就是可以在cmd中使用ndk-build命令进行手动编译。
除了上面的 ① NDK_ROOT ② Path 添加 NDK_ROOT 以外还需要的就是 还必须配置 CLASSPATH 变量 不然也不会成功。 现在暂时就发现需要配置这三个 (下载安装ndk 这个没算在里面)
之后自己在Terminal(View - ToolWindows - Terminal) 里面 输入 ndk-build javah java 如果都有回复 则 配置成功
3开始实战(其实是懒得分步写其他的步骤 直接整合到一步 我真机智哈哈哈)
打开 Local.properties 会有如下配置 则再次验证上一步成功
打开 gradle.properties 最下面自己写
android.useDeprecatedNdk=true
如图
打开Buidl Gradle (app) 在android - defaultConfig 里面 输入
ndk { moduleName "huazict" ldLibs "log", "z", "m" abiFilters "armeabi", "armeabi-v7a", "x86" }
里面第一行代表生成.so库的名字
如图
还是这个里面 在android 里面 写如下代码
sourceSets.main { jniLibs.srcDir 'libs' //下面这行加了不会出现ndk这个文件夹 //jni.srcDirs = [] }
具体干嘛的 我也不知道 以后估计就明白了 哈哈
如下图
做完这四步 就是配置Android Studio 里面的ndk
好了 接下来
真*开始!!
第一步,新建JNIUtils 这个是要以后调用的
static { System.loadLibrary("huazict"); } //java调用c中的方法都需要用native声明且方法名必须和c中的方法名一致 public native String getString();
第一个里面是.so库的名字 后面是native 方法是要调用的
之后 Make Project
然后 你会在 projict - app - build - intermediates - classes - debug - com... 下面找到 你新建的JNIUtils的 .class文件
然后找到它的路径 和JNIUtils 的 包名 要做如下整合
路径 :
C:\Users\Administrator\Desktop\JJNI\app\build\intermediates\classes\debug\com\example\administrator\jjni\JNIUtils
包名:
com.example.administrator.jjni.JNIUtils
Therminal命令 应该输入的 :
javah -d jni -classpath C:\Users\Administrator\Desktop\JJNI\app\build\intermediates\classes\debug com.example.administrator.jjni.JNIUtils
然后在 app 下会生成 jni 文件夹 里面有.h文件
接着要在 app - src - main 下新建 jni文件夹(小写)
把.h文件 Ctrl C Ctrl V 到该文件下下面
然后新建 .c 文件
.c代码如下
#include "com_example_administrator_jjni_JNIUtils.h" JNIEXPORT jstring JNICALL Java_com_example_administrator_jjni_JNIUtils_getString (JNIEnv *env, jobject obj) { return (*env)->NewStringUTF(env, "这是我测试的jni"); }
还要新建一个utils.c 不然以后会报错(别问我为啥,我是小白,不知道)
然后 Make Project
就会在 app - build - intermediates - ndk - debug - 出现lib 和 obj 里面都有.so文件
然后把 lib文件夹下的三个文件夹(里面各有一个.so文件) 粘贴到
src - main 下面 新建的jniLIB 文件夹下面
如图
然后就大功告成了 !! 哈哈 接着在MainActivity里面调用就可以了
----------------------------------------------------------------------分割线----------------------------------------------------------------------------
说一下途中遇到的问题
1,最要注意的一点!!!
.c 和,h 所在的路径(包名) 必须和 里面你写在方法前面的路径一样!!!否则会 报错
java.lang.UnsatisfiedLinkErrorNative method not found
这个是你的native 方法没有找到 这个必须要注意!
名字和你的包名一定要对上!!!如下图
2,不能生成.so文件???
这个具体原因 我也不是很清楚 我只能说说我的情况 因为我也遇到过
我的情况:我第一次用的时候 也是不会生成.so文件 , 并且还报错 报错具体内容没有了......不过里面说的是我的AS没有配置好ndk 让我去重新下一个或者安装插件
我的解决方法:新建一个项目,重新走一遍我写的这些步骤 就好了 ,具体愿意我也不知道,感觉是我之前看了其他网上的JNI使用 每个人写的都不一样 我用混杂了
可能是吧,我重新建一个项目 , 然后按照上面的配置Android Studio ndk 然后MakeProject 就会生成了
3,new JNIUtils. 不出来方法?
哈哈哈 这个估计只有我这个小白才会犯的错
应该是
new JNIUtils().方法 哈哈 之前这里也卡了一会
------------------------------------------------------------------------------分割线------------------------------------------------------------------
最后总结一下步骤: 安装配置NDK -------- 配置环境 --------------------- 配置ASNDK -------------------- 写JNIUtils -------------MakeProject 生成.class文件 -------------
Terminal 找路径 包名 编译生成.h 文件 ------------ 粘贴到 自己的 main 包下面 的jni文件架下面 ------------- 写.c 文件 utils.c ---------------MakeProject 生成 .so文件------
----------- 站到自己的 main 下新建 jniLIB 文件下下面 -------------MainActivity 调用 ----------------大笑 哈哈哈哈