* jni开发的步骤
* ①写java代码 声明本地方法 用到native关键字 本地方法不用去实现
* ②项目根目录下创建jni文件夹
* ③在jni文件夹下创建.c文件
* 本地函数命名规则: Java_包名_类名_本地方法名
* JNIENV* env JNIEnv 是JniNativeInterface这个结构体的一级指针
* JniNativeInterface这个结构体定义了大量的函数指针
* env 就是结构体JniNativeInterface这个结构体的二级指针
* (*env)->调用结构体中的函数指针
* 第二个参数jobject 调用本地函数的java对象就是这个jobject
/*
JNIEnv *env是结构体JNINativeInterface的二级指针,在二级指针前面加*就变成一级指针,*env就是一级指针,就可以访问结构体里面的函数指针.
JNIEnv是结构体JNINativeInterface的一级指针//typedef const struct JNINativeInterface* JNIEnv;
JNINativeInterface结构体中定义了大量的函数指针 这些函数指针在jni开发中很常用
jobject调用本地函数的java对象就是这个jobject
*/
* ④ 导入<jni.h>
* ⑤ 创建Android.mk makefile 告诉编译器.c的源文件在什么地方,要生成的编译对象的名字是什么
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello #指定了生成的动态链接库的名字
LOCAL_SRC_FILES := hello.c #指定了C的源文件叫什么名字
include $(BUILD_SHARED_LIBRARY)
* ⑥ 调用ndk-build编译c代码生成动态链接库.so文件 文件的位置 lib->armeabi->.so
* ⑦ 在java代码中加载动态链接库 System.loadlibrary("动态链接库的名字"); Android.mkLOCAL_MODULE所指定的名字
1,c本地函数命名规则
Java_包名_类名_本地方法名
eg:android_hardware_Camera_native_setup
2,函数参数前两个是固定必须带的JNIEnv* env, jobject thiz