两种实现方式
- Java_包名类名方法名
- RegisterNatives方法
native 方法如下
public static native String hello();
public native String _hello();
public native String hello_();
第一种方式:在Native中应该(采用的是c++的写法)
//第二个参数是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\"_\"");
}
如果想重载本地方法,这种方式是不能实现的。
第二种方式:通过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_},
};
最后再实现这三个方法就可以咯
JNI映射Java方法的参数类型,见下表:
类型签名 | 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);
它的类型签名应该是:
(ILjava/lang/String;[I)J
网友评论