我在一个使用JNI的项目中得到以下代码。到现在为止我可以理解这是一个结构数组并输入为JNINativeMethod,第一个名称是在Java代码中定义的方法("描述","运行_" ...),第二个定义方法类型和返回类型,第三个是方法指针。
但这是什么'&'符号表示方法名称之前,例如"(void *)& Java_Test_description"?这是一个基本问题,抱歉,我没有从互联网上找到任何有用的信息。我看到JNI的一些指南只是使用这种方式,如#34;(void *)Java_Test_description",它没有使用这个'&'符号
jni.c中的代码static JNINativeMethod classTest_methods[] = {
{ "description", "()Ljava/lang/String;", (void *)&Java_Test_description },
{ "skip", "()Z", (void *)&Java_Test_skip },
{ "skip_reason", "()Ljava/lang/String;", (void *)&Java_Test_skip_reason },
{ "run_", "(I)Z", (void *)&Java_Test_run_ },
};
答案 0 :(得分:1)
此& 会返回其后的实体的地址;在这种情况下,JNI方法描述使用实现本机方法的全局函数的地址。这些描述的列表将传递给 RegisterNatives() JNI函数。
在这种情况下,& address operator可以省略,因为对于函数
jboolean Java_Test_run_(int n);
C编译器解析
(void *)Java_Test_run_
与
相同(void *)&Java_Test_run_
答案 1 :(得分:0)
该符号是地址运算符。在任何变量之前使用它将返回后者的内存地址。
当你想避免处理由函数创建的变量副本时,它会很有用。