JNI开发流程
2016-07-12 20:09
162 查看
交叉编译
- 在一个平台上去编译另一个平台上可以执行的本地代码
- cpu平台 arm x86 mips
- 操作系统平台 windows linux mac os
- 原理 模拟不同平台的特性去编译代码
jni开发工具
- ndk native develop kit
- ndk目录
docs 帮助文档 - platforms 好多平台版本文件夹 选择时选择项目支持的最小版本号对应的文件夹
- 每一个版本号的文件夹中放了 不同cpu架构的资源文件
- include文件夹 jni开发中常用的 .h头文件
- lib 文件夹 google打包好的 提供给开发者使用的 .so文件
- samples google官方提供的样例工程 可以参考进行开发
- android-ndk-r9d\build\tools linux系统下的批处理文件 在交叉编译时会自动调用
- ndk-build 交叉编译的命令
jnihelloworld
jni开发的步骤
①写java代码 声明本地方法 用到native关键字 本地方法不用去实现- ②项目根目录下创建jni文件夹
- ③在jni文件夹下创建.c文件
- 本地函数命名规则: Java_包名类名本地方法名
- JNIENV* env JNIEnv 是JniNativeInterface这个结构体的一级指针
- JniNativeInterface这个结构体定义了大量的函数指针
- env 就是结构体JniNativeInterface这个结构体的二级指针
- (*env)->调用结构体中的函数指针
- 第二个参数jobject 调用本地函数的java对象就是这个jobject
- ④ 导入
jni开发中的常见错误
- java.lang.UnsatisfiedLinkError: Native method not found: 本地方法没有找到
本地函数名写错 - 忘记加载.so文件 没有调用System.loadlibrary
- System.loadLibrary(“libhello”); 加载动态链接库时 动态链接库名字写错
在jni目录下创建 Application.mk 在里面指定
APP_PLATFORM := android-14
- jdk 1.7 项目 src目录下运行javah
jni简便开发流程
- ① 写java代码 native 声明本地方法
- ② 添加本地支持 右键单击项目->andorid tools->add native surport
如果发现 finish不能点击需要给工作空间配置ndk目录的位置 - window->preferences->左侧选择android->ndk 把ndk解压的目录指定进来
usr 目录下 arch-arm -> include 确定后 会解决代码提示和报错的问题
C代码中向logcat输出内容
Android.mk文件增加以下内容 LOCAL_LDLIBS += -llog C代码中增加以下内容 #include <android/log.h> #define LOG_TAG "System.out" #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
* define C的宏定义 起别名 #define LOG_TAG “System.out” 给”System.out”起别名LOG_TAG
* #define LOGI(…) android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS)
* 给 __android_log_print函数起别名 写死了前两个参数 第一个参数 优先级 第二个参数TAG
* VA_ARGS 可变参数的固定写法
* LOGI(…)在调用的时候 用法跟printf()一样
C代码回调java方法
- ① 找到字节码对象
//jclass (FindClass)(JNIEnv, const char*); - //第二个参数 要回调的java方法所在的类的路径 “com/itheima/callbackjava/JNI”
- //jmethodID (GetMethodID)(JNIEnv, jclass, const char*, const char*);
- jobject obj =(*env)->AllocObject(env,claz);
- //void (CallVoidMethod)(JNIEnv, jobject, jmethodID, …);
相关文章推荐
- Android NDK 开发(一)JNI简介及调用流程
- Android的NDK开发(1)————Android JNI简介与调用流程
- Android jni/NDK 开发流程(注意事项)
- AndroidStudio进行JNI开发完整流程之环境配置
- JNI和NDK编程(一)JNI的开发流程
- JNI/NDK开发指南(一)—— JNI开发流程及HelloWorld
- JNI/NDK开发指南(一)—— JNI开发流程及HelloWorld
- Android的NDK开发(1)————Android JNI简介与调用流程
- [置顶] Android Studio3.0开发JNI流程------JNI函数
- android 串口jni 开发流程
- JNI开发流程
- NDK开发 - JNI开发流程
- [置顶] Android Studio3.0开发JNI流程------JNI入门级
- Android--JNI的开发流程
- JNI和NKD入门系列一,纯java工程下JNI的开发流程(mac系统)
- Android NDK 开发(一)JNI简介及调用流程
- JNI开发流程-JNI/NDK【转】
- JNI(一) - Android Studio简单开发流程
- JNI/NDK开发指南—— JNI开发流程及HelloWorld
- 编程基础知识——Java JNI开发流程(2)