兩種實(shí)現(xiàn)方式
- Java_包名類名方法名
- RegisterNatives方法
native 方法如下
public static native String hello();
public native String _hello();
public native String hello_();
第一種方式:在Native中應(yīng)該(采用的是c++的寫法)
//第二個(gè)參數(shù)是jclass,而不是jobject
jstring Java_com_zgg_jnidemo_JNITestActivity_hello(JNIEnv* env, jclass jobj){
return env->NewStringUTF("Hello from JNI");
}
//方法名中有下劃線"_",JNI中用"_1"代替"_"
jstring Java_com_zgg_jnidemo_JNITestActivity__1hello(JNIEnv* env,jobject jobj){
return env->NewStringUTF("Hello from JNI with pre\"_\"");
}
jstring Java_com_zgg_jnidemo_JNITestActivity_hello_1(JNIEnv* env,jobject jobj){
return env->NewStringUTF("Hello from JNI endWith\"_\"");
}
如果想重載本地方法沥曹,這種方式是不能實(shí)現(xiàn)的彬呻。
第二種方式:通過(guò)RegisterNatives方法
jint JNI_OnLoad(JavaVM *vm, void *reserved){
JNIEnv * env;
//獲取JNIEnv接口指針
if (vm->GetEnv((void**)&env, JNI_VERSION_1_4) != JNI_OK)
return JNI_ERR;
}
//獲取要映射的Java類
jclass clz = env->FindClass("com/zgg/jnidemo/JNITestActivity");
if (clz == NULL) {
return JNI_ERR;
}
if (env->RegisterNatives(clz, methods, sizeof(methods)/ sizeof(methods[0])) != JNI_OK) {
return JNI_ERR;
}
return JNI_VERSION_1_4;
}
然后看下methods 是怎么定義的
jstring hello(JNIEnv *env, jclass thiz);
jstring _hello(JNIEnv *env, jobject thiz);
jstring hello_(JNIEnv *env, jobject thiz);
static JNINativeMethod methods[] = {
{"hello", "()Ljava/lang/String;", (void*) hello},
{"_hello", "()Ljava/lang/String;", (void*) _hello},
{"hello_", "()Ljava/lang/String;", (void*) hello_},
};
最后再實(shí)現(xiàn)這三個(gè)方法就可以咯
JNI映射Java方法的參數(shù)類型,見(jiàn)下表:
類型簽名 | Java類型 |
---|---|
Z | boolean |
B | byte |
C | char |
S | short |
I | int |
J | long |
F | float |
D | double |
L full-qualified-class ; | full-qualified-class |
[type | type[] |
(arg-type)ret-type | method type |
例如:Java方法
long f(int n, String s, int[] arr);
它的類型簽名應(yīng)該是:
(ILjava/lang/String;[I)J