JNI开发的流程
规范,中间人,中间件 c/c++ <---> java
NDK: native develop kits 谷歌给安卓程序员提供的一个做jni开发的工具
NDK开发工具的目录结构
- doc 开发帮助文档
- build c语言编译的工具链 cygwin
- platform 平台: 指定了编译针对的Android平台
- arm 处理器架构 手机平板电脑 三星 摩托
- mips 处理器架构 开源的处理器架构(龙芯)
- x86 处理器架构 台式机 笔记本(intel,AMD)
>交叉编译: 使用交叉编译工具链在一个平台下编译出来另外一个平台可以运行的二进制代码
>c词法分析 语法分析 编译原理
- prebuild 预编译工具目录
.java -->.class --->jvm -->解释执行(java翻译机器语言)
.c --> .o --->根据机器类型链接 -->机器代码
- sample 示例代码
- source 工具链的源码
- tool chains 工具链
- ndk-build.cmd 编译c代码的工具脚本
## 开发流程
* JAVA程序员 搞Android开发
* c程序员 搞c开发,实现业务功能(例如用c实现一个加密算法)
* JNI工程师(胶水)
- 定义java的接口
- 定义c的接口
cdt Eclipse的插件
c/c++ develop tools,可以让c/c++的语法高亮显示。
编译c代码。ndk交叉编译的工具链。
JNI开发的流程
1. 现在java代码里面声明一个native的方法
public native String helloFromC();
2. 在Eclipse的工程目录下创建一个文件夹 名称jni
3. 编写c代码,按照规范编写
jstring Java_com_itheima_hellojni_MainActivity_helloFromC(JNIEnv* env,jobject obj){
char* str = "hello from c !!";
//在jni规范里面 在jni环境的结构体里面
//jstring (*NewStringUTF)(JNIEnv*, const char*);
//转化成了java的字符串
return (*(*env)).NewStringUTF(env,str);
}
Java_包名_类型_方法名(jvm虚拟机的指针,调用者对象)
4. ndk-build.cmd指令编译c代码
5. 配置Android.mk文件
#指定编译的文件夹 指定当前文件目录
LOCAL_PATH := $(call my-dir)
#编译器会定义很多的临时变量,中间变量,最好清空所有的中间变量。
include $(CLEAR_VARS)
#编译出来模块的名称
LOCAL_MODULE := hello
# 编译的源代码的名称
LOCAL_SRC_FILES := hello.c
#编译一个动态库,静态库
#静态库 文件名.a 包含所有的函数并且函数运行的依赖,体积大,包含所有的API
#动态库 文件名.so 包含函数,不包含函数运行的依赖,体积小,运行的时候,去操作系统寻找需要的API
include $(BUILD_SHARED_LIBRARY)
6. 生成一个.so的动态链接库
7. 在java代码里面,把动态链接库加载到jvm虚拟机
static{
System.loadLibrary("库文件名称不带前缀,后缀名");
}
8. 像调用一般java代码一样调用native的方法
阅读(647) | 评论(0) | 转发(0) |