// 返回類型 Java_包名_類名_方法名(JNIEnv*, jobject)
// 例:package com.ndk.testndk; class TestHello { native String jnia(); }
jstring Java_com_ndk_testndk_TestHello_jnia(JNIEnv* env, jobject obj);
extern "C" 防止名字修飾。jobject 為調用對象實例(非靜態方法)或類對象(靜態方法)。jint、jboolean 等;對象類型用 jstring、jobject。System.loadLibrary("TestNDK") 加載 libTestNDK.so。FindClass("com/ndk/testndk/TestHello2") 獲取 jclass。AllocObject(cls) 或 GetMethodID(cls, "", "()V") + NewObject。GetStaticMethodID(cls, "method", "()Ljava/lang/String;")GetMethodID(cls, "method", "(Ljava/lang/String;)Ljava/lang/String;")CallStaticObjectMethod(cls, mid)CallObjectMethod(obj, mid, args...)| Java 類型 | JNI 簽名 |
|---|---|
| int | I |
| String | Ljava/lang/String; |
| void | V |
| int[] | [I |
| Object | Lfull/package/Name; |
方法簽名:(參數簽名)返回簽名,如 (ILjava/lang/String;)V。
// Java
public class TestHello {
static { System.loadLibrary("TestNDK"); }
native int jnia();
native String jnistr();
}
// C++ (TestNDK.cpp)
#include
#include
extern "C" {
JNIEXPORT jint JNICALL Java_com_ndk_testndk_TestHello_jnia(JNIEnv* env, jobject obj) {
return 12;
}
JNIEXPORT jstring JNICALL Java_com_ndk_testndk_TestHello_jnistr(JNIEnv* env, jobject obj) {
jclass cls = env->FindClass("com/ndk/testndk/TestHello2");
jobject obj1 = env->AllocObject(cls);
jmethodID mid1 = env->GetStaticMethodID(cls, "getStaticString", "()Ljava/lang/String;");
jmethodID mid2 = env->GetMethodID(cls, "getString", "(Ljava/lang/String;)Ljava/lang/String;");
jstring jstr = (jstring)env->CallStaticObjectMethod(cls, mid1);
jstring jstr2 = (jstring)env->CallObjectMethod(obj1, mid2, jstr);
return jstr2;
}
}
/ 分隔,非 .。GetMethodID 返回 NULL。DeleteLocalRef 或用 PushLocalFrame。AttachCurrentThread 獲取 JNIEnv*。