关闭

手把手教你 ----JNI的基础实现

标签: JNI
466人阅读 评论(0) 收藏 举报
分类:

距离上一篇博客已经过去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  然后安装就行 , 我安装的时候不知道是网的原因还是电脑配置的原因 奇慢无比

经过漫长的等待之后 安装完成 , 不过!!别忘了配置环境   下图

      


之后自己在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.UnsatisfiedLinkError Native 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 调用  ----------------大笑 哈哈哈哈













1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:16120次
    • 积分:587
    • 等级:
    • 排名:千里之外
    • 原创:40篇
    • 转载:1篇
    • 译文:0篇
    • 评论:15条
    最新评论