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
- Android JNI开发姿势 学习 AS2.0以下打so包、2.0以上解决 include jni.h报红
- android ubuntu jni so 报错Java_com_gcx_ndkjni_HelloNdkJni_stringFromNDKJNI
- android jni 报错 libjnidispatch.so 找不到
- android jni 报错 libjnidispatch.so 找不到
- android jni 入门(2)jni编译生成so包
- Android NDK——使用Android Studio引用so库,jar包及module并使用JNI的正确姿势
- android studio jni.h 红色报错
- android studio jni.h 红色报错
- Android JNI学习之---JNI开发流程
- JNI学习-android下JNI开发
- Android Studio JNI 开发.so库
- eclipse android jni 开发,so库编译
- 解决NDK开发中Eclipse报错“Unresolved inclusion jni.h”的最终方法
- 解决NDK开发中Eclipse报错“Unresolved inclusion jni.h”的最终方法
- 解决NDK开发中Eclipse报错“Unresolved inclusion jni.h”的最终方法
- 解决NDK开发中Eclipse报错“Unresolved inclusion jni.h”的最终方法
- 解决NDK开发中Eclipse报错“Unresolved inclusion jni.h”的最终方法
- 解决NDK开发中Eclipse报错“Unresolved inclusion jni.h”的最终方法
- 数据库驱动程序
- uujdgylfyeiiksd
- Oracle Database 12.2 单实例的root.sh的变化--加入了安装TFA
- 关于java中this的用法
- acm练习 零起点学算法78——牛牛 2017 02 24
- Android JNI开发姿势 学习 AS2.0以下打so包、2.0以上解决 include jni.h报红
- Matlab 方括号“[ ]”的作用
- JAVA设计模式之单例模式
- 雷达扫描View的简单实现
- linux之启动过程与管理
- 处理框架--MapReduce
- JS入门
- /include/linux/hid.h
- Ubuntu之配置