JNI开发最详细最全入门
来源:互联网 发布:angularjs 清空数组 编辑:程序博客网 时间:2024/06/04 17:42
1 jni 开发使用 :
java native interface:
第一步 下载ndk :
可以上网搜 ,也可以用as里面的自带下载
第二步 写一个声明native 方法的类
public class JNIUtil { //加载so库 static { System.loadLibrary("JniTest"); } //native方法 public static native String helloWorld();}
第三步 生成class文件
打开android studio终端,
View ->ToolWindows-> Terminal
或者直接按alt+F12
使用javac编译上述文件,生成class文件:
D:\AndroidStudioProject\testJNI\app\src\main\java\com\xxx\jni>javac JNIUtil.java
在编译的过程中有可能出现找不到导入的类或者编码的过程 可以按以下格式写:
D:\xxx\xxx\xxx-xxx\app\src\main\java\com\music\xxx\jni>javac -encoding UTF-8 -classpath C:\Users\AppData\Local\Android\Sdk\platforms\android-25\android.jar JNIUtil.java
格式为 包名> javac -encoding UTF-8 -classpath 所导入的类的包 类名
点击run运行就会生成class文件
第四步: 生成.h文件
通过cd rd等命令 到
D:\co_project\xxx\xxx\app\src\main\java>
然后输入:
其中-encoding UTF-8 表示以UTF-8编译 否则可能会报错 因为编码是按系统默认编码
javah -jni -encoding UTF-8 com.music.xxx.util.JNIUtil
格式为com根目录下: javah -jni - encoding UTF-8 -classpath 要导入的类的目录;当前目录;包名+类名D:\xxx\xxx\app\src\main\java>javah -jni -classpath C:\xxx\AppData\Local\Android\Sdk\platforms\android-25\android.jar;.; com.music.xxx.jni.JNIUtil
过程中如果碰到 编码问题 或者52比51 新升级编译器的问题不用管直接按运行 同样的会生成头文件
/*DONOTEDITTHISFILE-itismachinegenerated*/#include<jni.h>/*Headerforclasscom_music_xxx_util_JNIUtil*/#ifndef_Included_com_music_xxx_util_JNIUtil#define_Included_com_music_xxx_util_JNIUtil#ifdef__cplusplusextern"C"{#endif/**Class:com_music_gramophone_util_JNIUtil*Method:helloWorld*Signature:()Ljava/lang/String;*/JNIEXPORTchar*JNICALLJava_com_music_xxx_util_JNIUtil_helloWorld(JNIEnv*,jclass);#ifdef__cplusplus}#endif#endif
第五步 java路径 新建JNI\main.c 拷贝 .h文件 并且实现里面的方法
/*DONOTEDITTHISFILE-itismachinegenerated*/#include<jni.h>/*Headerforclasscom_music_gramophone_util_JNIUtil*/#ifndef_Included_com_music_gramophone_util_JNIUtil#define_Included_com_music_gramophone_util_JNIUtil#ifdef__cplusplusextern"C"{#endif/**Class:com_music_gramophone_util_JNIUtil*Method:sayHello*Signature:()Ljava/lang/String;*/JNIEXPORTjstringJNICALLJava_com_music_gramophone_util_JNIUtil_helloWorld(JNIEnv*env,jclassj){return(*env)->NewStringUTF(env,"hello World");}#ifdef__cplusplus}#endif#endif
JNIEnv 用法:
http://blog.csdn.net/freechao/article/details/7692239
第6步:
配置NDK
打开Project的local.properties文件添加NDK路径
ndk.dir=C:\Users\xxx\AppData\Local\Android\Sdk\ndk-bundle
sdk.dir=C:\Users\xxx\AppData\Local\Android\Sdk
打开app Module的build.gradle文件,在defaultConfig节点里添加以下代码
注意这里的moduleName,是我们在之前自己编写的类里面加载的so库名
ndk {
moduleName “JniTest”
ldLibs “log”, “z”, “m”
abiFilters “armeabi”, “armeabi-v7a”, “x86”
}
还要在gradle.properties里面加上这么一句话:
android.useDeprecatedNdk=true
第7步
配置so库
生成SO库
完成以上步骤之后,我们rebuild一下就可以生成so库了
在项目的app\build\intermediates\ndk\debug\lib路径下
在src\main下新建文件夹jniLIB,并将生成的SO文件拷贝到该文件夹下
第8步
因为native方法声明成了静态的方法,在Activity里面直接调用myJNI类就行
Toast.makeText(this,JNIUtil.helloWorld(),Toast.LENGTH_SHORT).show();
- JNI开发最详细最全入门
- 最简单的Android JNI开发入门,JNI环境配置
- AndroidStudio最详细JNI教程
- AndroidStudio最详细JNI教程
- "Android Studio"下最简单详细的"JNI"开发
- 最全的webpack入门
- 软件开发最全流程
- 最全SpringMVC详细示例实战教程
- 最全SpringMVC详细示例实战教程
- iOS面试,最全详细梳理!
- 最详细的KMP全解
- 最全最强SpringMVC详细示例实战
- nginx配置详细-最全说明
- 最详细最全的redis配置文件解释
- 图论:HDU2544-最短路(最全、最经典的最短路入门及小结)
- ubantu下最强最全Git入门
- 最全 jdbc从入门到精通
- 最全的前端入门资源汇总
- Android6.0运行时权限的处理及解决办法
- python 函数返回多个值
- AngularJS入门-(8)过滤器
- 【USACO3.2.2】01串
- scrapy shell 调试返回403 返回为[]
- JNI开发最详细最全入门
- 那些年我理解的沉浸式状态栏?OR透明化状态栏?
- JavaScript日期对象使用总结 javascript Date日期对象的创建
- pex虚拟机自动安装
- 大规模分布式跟踪系统的理论
- Vue子父组件间的数据传递
- editplus初学前端之三
- 观察者模式与事件监听器模式--java设计模式扫盲
- match