繁体   English   中英

JNI:如何获取方法签名以进行调试

[英]JNI: How to get method signature for debugging purposes

  1. 我可以枚举java中的所有本机方法,那些必须使用JNI在c / c ++中实现的方法吗?
  2. 我可以按名称枚举本机方法(可能有多个具有相同名称的重载)?
  3. 如何检索方法签名以生成JNI使用的方法签名?

有没有办法检查是否已正确绑定所有本机jni方法,而不是尝试调用它们并获取java.lang.UnsatisfiedLinkError异常。 有时方法签名会在没有正确更新java或c ++方面的情况下发生变化,我想添加一些调试代码来检测这些问题并处理它们(可能通过生成正确的方法签名并将其打印到日志中以便我可以轻松修复码)。

我更喜欢JNI解决方案,但如果可以通过java方面的帮助来完成,那么它也可以。 如果我使用registerNatives并注册未在java中声明的方法,那么它将失败并将其打印到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技巧中建议 ),它注册所有本机方法。 在同一个函数中,我想验证所有本机方法是否正确绑定。 也就是说,我不需要等到调用一些未初始化的方法并且应用程序存在。 我遇到的问题:不同的ppl在不同的时间写了很多jni代码,有些方法变得不正确,但它们只在一些模糊的条件下使用。 对我来说,最好的方法是检查所有本机方法是否绑定到某些c ++函数。 另一个问题是,JNI代码的一部分通过导出所有这些Long_java_names来使用绑定,其中无法检测到任何一方的方法签名更改。

没有调用检查“未绑定”的本机方法。 使用RegisterNatives执行显式注册可确保您注册的所有方法在Java源代码中都具有匹配的声明,但是无法检查没有实现的本机声明的方法(除了调用它并捕获异常)。

在调用具有本机实现的方法的点上,如果尚未注册任何内容,则Dalvik将搜索各种共享库以查找匹配项。 你想要的是一种强制搜索并检查结果而不实际调用方法的方法。 哪有这回事。

有多种方法可以静态或在运行时生成本机声明的方法列表,但您还需要一种方法来确定实现是否可用。 从长远来看,你最好通过运行代码的单元测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM