Android JNI开发姿势 学习 AS2.0以下打so包、2.0以上解决 include jni.h报红

来源:互联网 发布:创意工作证设计软件 编辑:程序博客网 时间:2024/05/16 15:15
首先新建在activity同级或者全限定包中 新建一个原生方法(本地方法)的类
这里我们新建一个类名为 JNITest 的.java文件

原生方法为 public native StringhelloJNI();
静态代码快中 加载的是我们指定的so包的名字
这里我们可以先写好指定名字,后面打出来的so包就是这个名字 为JniTest

接下来就可以 生成 .h 文件了 在AS 的 Terminal命令行 或者 cmd中 都可以 只要在项目的main\java这个路径下就可以。
执行命令:
E:\Android\Project\NdkDemo\app\src\main\java>
javah -jni com.example.administrator.ndkdemo.JNITest
错误: 编码GBK的不可映射字符


可能会出现上面GBK的不可映射字符 这是因为.java文件中有GBK编码格式的字符,这就需要我们手动来把java文件编译成.class文件。再来执行javah命令生成 .h文件

手动指定文件的格式为UTF-8, 如果是编译包下所有的.java文件 那 *.java就可以了
命令行执行命令
javac -encoding UTF-8 java\com\example\administrator\ndkdemo\JNITest.java

这个时候.class文件已经生成了,再生成 .h文件
命令行执行命令
javah -jni com.example.administrator.ndkdemo.JNITest

这个时候你就能在JNITest.java同级目录下看到.h文件了

接下来在AS中项目中的main目录上新建一个jni目录 把.h文件移到里面去,
接着新建一个.c文件 把.h文件中的内容复制过去,然后实现其中的方法
然后新建一个empty.c空的文件就好了,里面什么都不要写,因为这是JNI的bug ,有两个文件你才能编译通过。

就像我这样


注意我这里执行的所有命令行 中的命令都是在java这一级目录中执行的



继续配置 local.proerties 中ndk的目录


在app module中的build.gradle文件中
defaultConfig节点下配置ndk

ndk{
moduleName "JniTest"//lib的名称,对应LOCAL_MODULE
//stl "stlport_shared" //对应APP_STL
ldLibs "log","z","m"//链接时使用到的库,对应LOCAL_LDLIBS
//cFlags 编译gcc的flag,对应LOCAL_CFLAGS
abiFilters "armeabi", "armeabi-v7a", "x86" //cpu的类型
}

还要在gradle.properties里面加上这么一句话:android.useDeprecatedNdk=true


最后终于可以动手生成so包了,ReBuild Project


生成的so包在 这个目录下


这三个包里面就是so包
然后在main目录中创建一个jniLib把上面生成的3个so包的文件夹复制进去





接下来说说AS2.0怎么搞JNI
2.0版本的AS用上面方法 玩JNI 能编译通过,只是异常找不到原生方法
UnsatisfiedLinkError: Native method not found: com.example.administrator.ndkdemo.JNITest.helloJNI:()

其他情况下报出这个异常可以检查一下原生方法和C中的方法名是否对应上了,

我们的解决方案在下面

先告诉大家对应的so文件在


首先 下面创建项目的时候 Include C++ Support 是要勾上的,谷歌在AS2.0以后大家会以为#include <jni.h>报红是个bug,其实有其他的解决方法。这里勾上后会自动创建cpp文件夹、CMake文件、还有其他gradle的配置



检查自己的下面三个地方要勾上,该下载的就让他下载



接着配好NDK地址



然后就开开心心的去创建项目吧
记得要勾上Include C++ Support


创建好了以后你会发现多了这个cpp



原生方法的实现全都写在cpp里面 ,注意 用个
extern"C"{}括起来,把方法写在大括号里面,否则编译的时候会把这个方法丢掉,然后抛出原生方法找不到的异常

还有一个
AS中提示真的非常棒 C++ 可以像Java一样提示




0 0
原创粉丝点击