Android JNI开发姿势 学习 AS2.0以下打so包、2.0以上解决 include jni.h报红
2017-02-24 23:46
204 查看
首先新建在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一样提示
这里我们新建一个类名为 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一样提示
相关文章推荐
- android 开发中通过JNI无法向SD卡写入文件的解决办法
- 【Android开发学习37】android opengl es 2.0里surfaceview背景透明
- 零基础学习SDL开发之移植SDL2.0到Android
- Android NDK(学习笔记四)—— 在NDK开发中JNI打印Log信息
- 零基础学习SDL开发之在Android使用SDL2.0加载字体
- Android学习 - 4.0以上的系统,对话框界面一碰屏幕,对话框就消失了解决方法
- [原]零基础学习SDL开发之在Android使用SDL2.0显示BMP叠加图
- 零基础学习SDL开发之在Android使用SDL2.0显示BMP图
- [原]零基础学习SDL开发之在Android使用SDL2.0加载字体
- Android JNI学习之---JNI开发流程
- android 地图服务开发 INSTALL_FAILED_MISSING_SHARED_LIBRARY 错误解决 地图服务开发中遇到此类错误大体分为以下两种情况解决:
- [原]零基础学习SDL开发之移植SDL2.0到Android
- Android JNI和NDK学习(01)--搭建NDK开发环境
- 零基础学习SDL开发之在Android使用SDL2.0显示BMP叠加图
- Android开发学习笔记(11):Android问题解决对策集(更新中...)
- 【学习Android NDK开发】Java通过JNI调用native方法
- Cocos2D-x 2.0以上版本跨Android开发环境的搭建---------------------cocos2d-x 3.0正式版本(7.2)
- android 开发中通过JNI无法向SD卡写入文件的解决办法
- 【android】NDK开发编译C++文件出现Type 'jint' could not be resolved和Unresolved inclusion: <jni.h>的解决办法
- 零基础学习SDL开发之在Android使用SDL2.0渲染PNG图片