一、简介
- java是跨平台,C与平台有关,但是C与底层交互性能好
- Java Native Interface:Java本地接口,实现java和本地语言c/C++相互调用
二、为什么需要jni
C/C++作为本地语言,效率有保证,所以应用场景有如下方面:
1. 操作底层硬件,android设备上的传感器,距离传感器
2. 应用程序要求效率高,图形渲染,音视频解码
3. 应用程序要求比较高,金融相关,军工产品 ,关键逻辑用C/C++;
4. 复用C/C++开源软件
5. 利用公司之前代码
三、使用JNI的四个前提
- 熟练使用java
- 了解C基础语法
- 熟悉JNI规范
- 掌握开发工具NDK
四、jni.h文件内容
typedef struct JNINativeInterface* JNIEnv;
struct JNINativeInterface {
...
jclass (*FindClass)(JNIEnv*, const char*);
...
JNIEnv *env;
// env <=> JNIEnv * <=> struct JNINativeInterface**
// (**env).FindClass();
// (*env)->FindClass();
五、jni相关概念
交叉编译
在一个平台上为另一个平台编译程序。不同的操作系统windows Mac OS X Linux;不同处理器架构 x86 ARM Mips
工具链
编译本地代码过程依次使用工具,顺序使用形成链条arm-linux-gcc
函数库
实现某类功能函数二进制代码集合.使用库需要两个文件 .h头文件 还有库文件(.a .so), stdio string
静态链接库 .a 只用在链接过程拷贝库中代码,运行程序不需要静态库支持
- 动态链接库 (共享库) .so 用在链接过程记录用到什么库的什么函数,运行程序之前需加载动态库到内存。
六、 jni开发使用的工具
- NDK : Native Development kit 本地开发工具集 构建和编译本地c/c++代码一套工具
- CDT : C/C++ Development Tools 编辑本地源文件,语法检查,编译工具调用
- CygWin : windows下提供类unix模拟环境