static JNINativeMethod method_table[] = { { "nativeInit", "()V", (void*)init_native}, { "nativeExecSuCmd", "(Ljava/lang/String;)I", (void*)execSuCmd_native }, { "nativeSetProperty", "(Ljava/lang/String;Ljava/lang/String;)I", (void*)setProperty_native }, { "nativeGetProperty", "(Ljava/lang/String;)Ljava/lang/String;", (void*)getProperty_native }, };
时间: 2024-04-26 09:24:18 浏览: 12
这段代码定义了一个名为 method_table 的静态数组,其中包含了 4 个元素,每个元素都是一个 JNINativeMethod 结构体,它们分别对应了 4 个 JNI 方法。
每个 JNINativeMethod 结构体包含三个字段:第一个字段是 JNI 方法名,第二个字段是 JNI 方法的签名,第三个字段是指向本地方法实现函数的指针。其中,签名是用 JNI 规范定义的方法描述符,它指定了方法的参数类型和返回值类型。
这个 method_table 数组的作用是在 JNI_OnLoad 函数中注册本地方法,使得 Java 代码可以调用对应的本地方法。
相关问题
//定义批量注册的数组,是注册的关键部分 static const JNINativeMethod gMethods[] = { { "Native_JniTest","()J", (void*)Jni_Test}, { "Native_JniCalcDesMac64","([B[BI)[B", (void*)Jni_CalcDesMac64} }; 什么意思
这段代码定义了一个名为gMethods的静态常量数组,数组中包含两个元素,每个元素都是一个结构体 JNINativeMethod。这个结构体包含了三个字段,分别是:方法名、方法签名和函数指针。第一个元素的方法名是 "Native_JniTest",方法签名是 "()J",函数指针是 Jni_Test;第二个元素的方法名是 "Native_JniCalcDesMac64",方法签名是 "([B[BI)[B",函数指针是 Jni_CalcDesMac64。这些方法都是 JNI(Java Native Interface)的本地方法,可以用 C/C++编写,然后通过 JNI 调用。
static const JNINativeMethod gMethods 在源码的那个位置
这个变量 `gMethods` 是一个结构体数组,用于注册 JNI 方法。它可以在 JNI 的 .cpp 文件中定义,通常是在类的声明之后。
具体来说,它的定义通常出现在类的声明之后,但在 JNI_OnLoad 函数之前。在 Android 源代码中,这个变量的定义通常会在类的实现文件中,如下面的例子所示:
```c++
static const JNINativeMethod gMethods[] = {
{"nativeMethod1", "()V", reinterpret_cast<void *>(nativeMethod1)},
{"nativeMethod2", "()V", reinterpret_cast<void *>(nativeMethod2)}
};
jint JNI_OnLoad(JavaVM* vm, void* reserved) {
JNIEnv* env;
if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
return JNI_ERR;
}
jclass clazz = env->FindClass("com/example/MyClass");
env->RegisterNatives(clazz, gMethods, sizeof(gMethods) / sizeof(JNINativeMethod));
return JNI_VERSION_1_6;
}
```
在这个例子中,`gMethods` 数组包含了两个元素,每个元素是一个 `JNINativeMethod` 结构体,表示一个 JNI 方法。这些方法在 `JNI_OnLoad` 函数中通过调用 `RegisterNatives` 函数注册到 JVM 中。