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