美文网首页
Java 调用jni方法

Java 调用jni方法

作者: 跟跟_a5e9 | 来源:发表于2017-12-04 15:15 被阅读0次

两种实现方式

  1. Java_包名类名方法名
  2. 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

相关文章

网友评论

      本文标题:Java 调用jni方法

      本文链接:https://www.haomeiwen.com/subject/sjotixtx.html