1

我看到JNI使用这些类型的功能,但我不知道它是什么:

JNIEXPORT void JNICALL Java_ClassName_MethodName
   (JNIEnv *env, jobject obj)
 {
     /*Implement Native Method Here*/
 }

就 c 语言功能而言,“JNIEXPORT”和“JNICALL”是什么?

是否可以创建这样的注释:

ROUTE("/test/whatever") 
void function(int x)
{
} 

并使其有效 C? 我需要能够以某种方式在运行时将这些注释与相应的函数相关联。有没有办法做到这一点?我知道可以在运行时从 ELF 文件中读取函数指针,因此这部分已经完成。现在我只需要一些方法来注释函数。我不在乎实现有多丑陋,它只需要在 Linux 上运行。

4

2 回答 2

3

JNIEXPORT是一个宏,其计算结果类似于__declspec(dllexport),具体取决于您的编译器/平台。并JNICALL评估调用约定,即__stdcall或适合您的编译器/平台的任何内容。

至于问题的第二部分,C 中没有运行时反射能力,因此没有注释。

于 2012-05-09T09:38:10.097 回答
2

如果您有时间并接受丑陋的、特定于 Linux 的解决方案,您还可以考虑使用MELT扩展(MELT 是一种高级域特定语言,具有类似 Lisp 的语法来扩展 GCC)或使用 GCC 插件编码来定制您的 GCC 编译器在 C.

定制或扩展 GCC(或任何其他工业级 C 或 C++ 编译器)需要时间(几周,而不是几小时),因为 GCC 是一个非常复杂的程序。您必须了解 GCC 中端内部表示(尤其是GimpleTree -s)和传递,两者都是复杂的事情。你可以在gcc-melt.org上找到一些关于 MELT 的幻灯片,它们提供了关于它们的参考和解释。

您可以为 [运行时反射] 注释使用例如编译指示或内置函数自定义 GCC(并且您会喜欢使用您的或使用您的编译指示或内置#define函数的宏);那么您将不得不通过例如添加特定的通行证来处理您的特定编译指示或内置函数来扩展 GCC。JNIEXPORTJNICALL

于 2012-05-09T10:12:51.977 回答