1.ndk工具:基于ARM的交叉编译器,
ndk-build:默认按jni中的Android.mk编译
ndk-build -B:重新编译
2.r4不支持c中多线程,相应的2.1之前的JVM也不支持;r5与2.2后的JVM可支持;
以调用引擎库为目标,将地图引擎编译为libengine.so库:
1. 在android的项目中添加一个文件夹jni,jni下放置引擎.c与.h源代码;
2. 编写与java代码交互的main.c接口文件,其中#include <jni.h>,提供java调用的接口,main.c中的接口方法与一个.java接口文件中的native方法对应,方法名需符合jni规范
3. jni中写一个类似c中MakeFile的Android.mk文件,根据该文件由ndk-build将引擎编译为libengine.so动态链接库;Android.mk写法如下,结合项目:
a.LOCAL_PATH := $(call my-dir),通过调用($()表示调用)预先定义的宏定义编译的c源码查找路径;:=表示覆盖,+=表示追加
b.include $(CLEAR_VARS),清除其它的local_变量定义,include $()表示加入代码
c.LOCAL_CFLAGS := -DTK_FB_BPP=32 -std=c99,提供编译器的参数,指定图片一个象素用32位,使用c99规范编译
d.LOCAL_LDLIBS := -llog -lz,提供链接参数,log日志、z压缩两个库
e.LOCAL_MODULE := engine,定义产生的库
f.LOCAL_SRC_FILES := other.c main.c,指定要编译的c文件,不需要写.h头文件
g.include $(BUILD_SHARED_LIBRARY),调用宏编译生成 libengine.so库;构建库有两种static为静态库,share为共享库会复制到apk中;
4.在项目所在路径运行 ndk-build,默认交叉编译生成基于ARM架构的 libengine.so库在lib文件夹下
5.在 .java接口文件中通过System.loadLibrary("engine")加载引擎库,实现java对c库的调用
/******************************************************************************
JNI:JVM与c/c++之间互操作;数据类型转换、内存管理
******************************************************************************/
1.JNI规范由SUN定义,JVM实现;
2.环境变量LD_LIBRARY_PATH,设定加载库的查询路径;
3.JNI:
JNIEnv:一个JNI函数表
4.类型映射:
基本(原子)类型映射简单,c与java的数据类型转换;如int--jint;
对象,JNI对象基类为jobject,
5.jString--String:JNI提供utf-16/utf-8的相互转换
c申请的内存若返回给java则有JVM管理native部分内存
6.c调java:使用第二个参数jobject,(*env)->GetObjectClass(env,jobject)获取jclass
classloader根据classpath来加载类
jni可访问java中private/protected/public类静态/实例域
jni可访问java中private/protected/public类静态/实例/构造/父类方法