Android jni学习
笔者使用的是eclipse开发环境,ndk环境已搭建好(怎样搭建可百度 so easy)
jni使用流程:
1.随便新建一个Android项目,在项目根目录下创建jni目录,并在目录下建立一个Android.mk文件
Android.mk文件编译如下(双斜杠为注释部分,不用复制):
//编译时的目录,开发树中查找源文件。,宏函数’my-dir’, 由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) //
//LOCAL_MODULE变量必须定义,以标识你在Android.mk文件中描述的每个模块。名称必须是唯一的,而且不包含任何空格。注意编译系统会自动产生合适的前缀和后缀,换句话说,一个被命名为'foo'的共享库模块,将会生成'libfoo.so'文件。
LOCAL_MODULE := nativeadd //编译后库文件的名称
//LOCAL_SRC_FILES变量必须包含将要编译打包进模块中的C或C++源代码文件。注意,你不用在这里列出头文件和包含文件,因为编译系统将会自动为你找出依赖型的文件;仅仅列出直接传递给编译器的源代码文件就好。【注意,默认的C++源码文件的扩展名是’.cpp’. 指定一个不同的扩展名也是可能的,只要定义LOCAL_DEFAULT_CPP_EXTENSION变量,不要忘记开始的小圆点(也就是定义为‘.cxx’,而不是‘cxx’)(当然这一步我们一般不会去改它)】
LOCAL_SRC_FILES := nativeadd.c //这里写的是需要编译的.c文件
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
include $(BUILD_SHARED_LIBRARY)
2.在java文件中建立有native方法的类文件:
3.用javah 命令生成c的头文件
这里有两种方法可以实现:
a.eclipse 中配置javah命令
备注:上图中需要配置的三项内容如下:
${system_path:javah}
${workspace_loc}
-v -classpath "${project_loc}/bin/classes" -d "${project_loc}/jni" ${java_type_name}
配置好之后,选中需要本地包含native方法的java类 ,并运行javah命令,刷新jni目录,该目录会多一个.h文件
4.在jni目录建立一个.c文件 实现头文件中的方法
5.命令行中进入jni文件目录,使用ndk-build命令生成.so文件:
成功后,本项目libs目录下会多个.so文件
6.在项目调用native jni方法
完结。
注:其中第三步 javah 命令生成c的头文件
第二种方法,将NativeAdd类在eclipse中导出为jar(主要为了获取.class文件)
并解压到文件到电脑中的任意目录
cd 到该目录,直接使用命令:javah -jni com.zbtx.maize.nativedemo.NativeAdd,即可生成.h文件