RegisterNatives()函数映射JNI本地函数与Java本地方法

java 代码

HelloJNI.java

class HelloJNI{
	native void printHello();
	native void printString(String str);

	static{System.loadLibrary("hellojnimap");}
	
	public static void main(String args[]){
		HelloJNI myJNI = new HelloJNI();
		
		myJNI.printHello();
		myJNI.printString("Hello world from printString fun");
	}
}

C++代码

hellojnimap.cpp

#include "jni.h"
#include "stdio.h"

//JNI 本地函数原型
void printHelloNative (JNIEnv *env, jobject obj);
void printStringNative(JNIEnv *env, jobject obj, jstring string);

JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved){
	JNIEnv* env = NULL;
	JNINativeMethod nm[2];
	jclass cls;
	jint result = -1;

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

	cls = env->FindClass("HelloJNI");

	//java本地方法名
	nm[0].name = "printHello";
	//java本地方法签名
	nm[0].signature = "()V";
	//与 java 本地方法相对应的 JNI 本地函数指针
	nm[0].fnPtr = (void *)printHelloNative;

	nm[1].name = "printString";
	nm[1].signature = "(Ljava/lang/String;)V";
	nm[1].fnPtr = (void *)printStringNative;

	env->RegisterNatives(cls, nm, 2);

	return JNI_VERSION_1_4;
}

//实现JNI本地函数
void printHelloNative(JNIEnv *env, jobject obj){
	printf("Hello world!\n");
	return;
}

void printStringNative(JNIEnv *env, jobject obj, jstring string){
	const char *str = env->GetStringUTFChars(string,0);
	printf("%s!\n",str);
	return;
}

运行

1.编译 java 代码

javac HelloJNI.java

2.编译cpp代码生成共享库

gcc -shared -fPIC -I /usr/lib/jvm/java-7-openjdk-amd64/include hellojnimap.cpp -o libhellojnimap.so

3.运行

java -Djava.library.path=. HelloJNI

结果:
在这里插入图片描述
参考资料:
《Android框架揭秘》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章