2011-09-23 270 views
2

我想通过jni注册一个本地函数,为此,我必须在jninativemethod结构中存储一个函数指针,该函数指针具有void *字段。如何正确使用RegisterNatives

在设置该字段时,在使用unix编译GCC时出现错误error: invalid conversion from void (*)(JNIEnv*, _jclass*, jlong, _jobject*)' to void*

我环顾四周,似乎你不允许将函数指针转换为void指针,那么这个接口是否被破坏?有没有一种“正确”的方式来做到这一点? (除了使用javah生成头文件和导出函数外)

+0

你铸造你的函数指向'void *'的指针,还是试图直接指定它们?直接分配不起作用,但'reinterpret_cast'应该可以做到。 –

+0

显式转换为void *会关闭编译器,我只是担心它会在某个平台上崩溃,因为它不被C++标准所允许。 – Bwmat

回答

4

在C++中,将函数指针转换为void*是错误的,因为标准声明它是未定义的行为。

但是,在类似RegisterNatives的情况下,确实没有其他选择。幸运的是,尽管标准抗议,但您可能使用JNI的编译器足以让演员表现得如您所期望的那样。

值得一提的是,Visual C++ documentation for void明确提到“void指针可以指向函数”,所以在这一点上你的状态很好。此外,the POSIX function dlsym也需要虚空到功能的转换才是合法的,所以GCC似乎不太可能让你在这里绊倒你。

您还可以查看以下两个答案有关void指针和函数指针之间铸造的合法性和有效性的更多信息: