- 我可以枚举 Java 中的所有本机方法,那些必须使用 JNI 在 c/c++ 中实现的方法吗?
- 我可以按名称枚举本机方法吗(可能有多个同名的重载)?
- 如何检索方法签名以生成 JNI 使用的方法签名?
有没有办法检查所有本机 jni 方法是否已正确绑定,而不是尝试调用它们并获取 java.lang.UnsatisfiedLinkError 异常。有时方法签名会在没有正确更新 java 或 c++ 端的情况下更改,我想添加一些调试代码来检测这些问题并处理它们(也许通过生成正确的方法签名并将其打印到日志中,以便我可以轻松修复代码)。
我更喜欢 JNI 解决方案,但如果可以在 java 方面的帮助下完成某些事情,那也没关系。如果我使用未在 java 中声明的 registerNatives 和 register 方法,那么它会失败并将其打印到 logcat:
E/dalvikvm( 1445): ERROR: couldn't find native method
E/dalvikvm( 1445): Requested: Lcom/bla/bla/bla/Test;.nativeTestXX:()Z
但我想抓住这个错误并自己处理。有可能做到吗?
编辑: 在我的 JNI 代码中,我有一个静态的 nativeInit(如Android JNI 提示中所建议的),它注册了所有本机方法。在同一个函数中,我想验证所有本机方法是否已正确绑定。也就是说,我不需要等到调用了一些未初始化的方法并且应用程序存在。我遇到的问题:有很多 jni 代码在不同的时间由不同的 ppl 编写,有些方法根本不正确,但它们只在一些晦涩的条件下使用。我认为,对我来说最好的方法是检查所有本机方法是否都绑定到某个 c++ 函数。另一个问题是,JNI 代码的一部分通过导出所有这些 Long_java_names 来使用绑定,其中无法检测到任何一方的方法签名更改。