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

距离上一篇博客已经过去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% ;
  1. 其实你定义的变量名字是什么都无所谓,只要保证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 调用  ----------------大笑 哈哈哈哈













  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值