Android NDK静态注册 动态注册

 1、jni:java native interface
    作用:用于java代码和C++、c代码的交互(代码混编);
    分类使用:Jni静态注册、jni动态注册
2、静态注册
    1).绑定java方法和C/C++方法的方式之一;
    2).java层操作和c层操作以及整体编译
            1-定义被native修饰的方法
            2-根据java代码生成.h头文件(javah -jni 类的包名路径)
            3-编写C/C++代码,导入.h头文件,实现我们.h头文件中方法
            4-编写(配置)两个mk文件:application.mk/android.mk
            5.通过ndk-build生成so文件;
            6.java代码中加载so文件(system.loadlibrary)
            7.补充:获取so库的名称
                    1-libs文件下去头去尾(头:lib;尾:.so);
                     2.在android.mk直接复制模块名称;
3.动态注册
    1)作用:.绑定java方法和C/C++方法的方式之一
    2)流程
            1-java中定义native的方法
            2-创建C++代码代码,导入头文件;
            2.1-编写(配置)两个mk文件:application.mk/android.mk
            3-JNInativeMethod:绑定java方法和C/C++的方法
            4-registerNatives(4个参数):注册java层相应的类以及方法
            5-使用jni.h中JNI_onload进行判断:注册是否成功(JIN_onload:系统调用,相当于java中的psvm:public static void main)
            6-ndk-build生成so,
            7-java代码中加载so文件(system.loadlibrary)

总结:静态注册和动态注册比较
            静态注册:1.编写不方便,jni方法名必须遵守规则且名字很长;
                              2.过程较多,效率低    
                              3.不安全,
             动态注册:1.流程清晰可控
                               2.效率更高,安全
                               3.JIN_onload

NDK开发总结
关于头文件:
    1.静态注册:
            创建了4个文件:.c、.h、.mk、.mk
                     JNIstudy.c:#inude < .h>
                                各种代码的实现:实现java层被native修饰的方法
                       JNIstudy .h:#include <jni.h>、#include <number.h>、#include <String.h>
                        mk:配置文件;
        捋一捋这句话:在.c文件里面导入包含jni.h头文件的 JNIstudy.h头文件
                
   2.动态注册    
   创建了3个文件:.c、.mk、.mk
                        .c:#include <jni .h>
                                各种代码的实现:实现java层被native修饰的方法
                        mk:配置文件;
            
下面是一篇动态注册 .c  示例文件:

#include <jni.h>

//实现java层被native修饰的方法
jfloat addc(JNIEnv* env,jobject obj ,jfloat a,jfloat b){
	return a+b;
}

jfloat subc(JNIEnv* env,jobject obj ,jfloat a,jfloat b){
	return a-b;
}

jfloat mulc(JNIEnv* env,jobject obj ,jfloat a,jfloat b){
	return a*b;
}

jfloat divc(JNIEnv* env,jobject obj ,jfloat a,jfloat b){
	return a/b;
}

//绑定java方法和C方法的关系
//三个参数:java层方法名 返回值+类型 C层方法名 
JNINativeMethod nativeMethon[]={

		{"add","(FF)F", (void*)addc},
		{"sub","(FF)F", (void*)subc},
		{"mul","(FF)F", (void*)mulc},
		{"div","(FF)F", (void*)divc}
};

//注册相应的类以及方法;
jint registerNatives(JNIEnv* env){

	jclass   _jclass = (*env)->FindClass(env, "com/example/computer/MainActivity");

	//RegisterNatives,注册方法;
	//第一个、第二个:env,clazz;  第三个:定义的数组名;第四个:数组元素的个数
	// JNI_OK =0 

	 if((*env)->RegisterNatives(env, _jclass,  (nativeMethon)/sizeof(nativeMethon[0]))!=JNI_OK)
	 {
		 return JNI_ERR;
	 }
	return JNI_OK;
}

//动态注册 
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved){
	JNIEnv* env;


	 if( (*vm)->GetEnv(vm, (void**)&env, JNI_VERSION_1_4)!=JNI_OK){
		 return JNI_ERR;
	 }

	if(registerNatives(env)!=JNI_OK){
		 return JNI_ERR;
	}

	return JNI_VERSION_1_4;	//必须返回这个值

}


猜你喜欢

转载自blog.csdn.net/qq_41369057/article/details/131243014