首页 > 系统 > Android > 正文

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

2019-11-07 23:46:00
字体:
来源:转载
供稿:网友
首先新建在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%20module中的build.gradle文件中defaultConfig节点下配置ndkndk{moduleName%20"JniTest"//lib的名称,对应LOCAL_MODULE//stl%20"stlport_shared"%20//对应APP_STLldLibs%20"log","z","m"//链接时使用到的库,对应LOCAL_LDLIBS//cFlags%20编译gcc的flag,对应LOCAL_CFLAGSabiFilters%20"armeabi",%20"armeabi-v7a",%20"x86"%20//cpu的类型}还要在gradle.properties里面加上这么一句话:android.useDeprecatedNdk=true最后终于可以动手生成so包了,ReBuild%20Project生成的so包在 这个目录下这三个包里面就是so包然后在main目录中创建一个jniLib把上面生成的3个so包的文件夹复制进去接下来说说AS2.0怎么搞JNI2.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一样提示
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表