Java 調(diào)用jni方法

兩種實現(xiàn)方式

  1. Java_包名類名方法名
  2. RegisterNatives方法

native 方法如下

public static native String hello();
public native String _hello();
public native String hello_();

第一種方式:在Native中應(yīng)該(采用的是c++的寫法)

//第二個參數(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\"_\"");
}

如果想重載本地方法,這種方式是不能實現(xiàn)的。

第二種方式:通過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_},
};

最后再實現(xiàn)這三個方法就可以咯
JNI映射Java方法的參數(shù)類型,見下表:

類型簽名 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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容