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框架揭祕》

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