java - JNI : How to get method signature for debugging purposes

标签 java c++ android-ndk java-native-interface

  1. 我可以枚举 java 中的所有 native 方法吗? 使用 JNI 在 c/c++ 中实现?
  2. 我可以通过以下方式枚举 native 方法吗 名称(可能有多个同名的重载)?
  3. 如何检索方法签名才能生成方法 JNI 使用的签名?

有没有办法检查是否所有 native jni 方法都已正确绑定(bind),而不是尝试调用它们并获取 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 代码中,我有一个注册所有 native 方法的静态 nativeInit(如 Android JNI tips 中所建议)。在同一个函数中,我想验证是否所有 native 方法都已正确绑定(bind)。也就是说,我不需要等到某些未初始化的方法被调用并且应用程序存在。我遇到的问题是:有很多 jni 代码是由不同的人在不同的时间编写的,有些方法变得不正确,但它们只在一些模糊的条件下使用。我认为对我来说最好的方法是检查所有 native 方法是否都绑定(bind)到某个 C++ 函数。另一个问题是,部分 JNI 代码通过导出所有这些 Long_java_names 使用绑定(bind),其中无法检测到任何一方的方法签名更改。

最佳答案

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

在调用具有 native 实现的方法时,如果尚未注册任何内容,则 Dalvik 将搜索各种共享库以找到匹配项。听起来您想要的是一种强制搜索并检查结果而无需实际调用该方法的方法。没有这样的事情。

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

关于java - JNI : How to get method signature for debugging purposes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13172623/

相关文章:

java - 在 Java 中处理包含等于 ("=") 的 Cookie

java - JPanel 上的工具提示出现阴影错误

c++ - 通过 C++ 提供登录名和密码,就像 Unix/Linux 中的 expect 脚本

c++ - 文件描述符的 Read() 挂起

android - android 会杀死我以 root 身份运行的守护进程吗?

java - 如何使用远程 Java 编译器?

java - 定义中的初始化与构造函数中的初始化

c++ - Vector 内的类切片

c++ - 将 Symbian C++ 移植到 Android NDK

安卓工作室 NDK : could not load library "libgnuSTL_shared.so"