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