android - 在 JNI 共享库中查找函数?

标签 android c++ java-native-interface

有谁知道如何使用面向公众的 JNI 函数/方法通过 NDK 编译的共享库显示所有可用函数?

我有一个 lib*jni.so 文件,我需要访问它的方法。使用 nm -Dg lib*jni.so 输出在共享库中找到的所有符号。我只是在寻找定义为 JNI Hook 的那些。

谢谢, 凯文

最佳答案

您可以使用一些技巧来找出这一点。

  1. 检查相应的 .class 文件。如果您有库的 .class 文件,您可以在 Eclipse 中打开它们并搜索 native关键字查看哪些方法已声明为在 native 中实现。

  2. 使用 strings 命令转储所有字符串。 除非该库执行 Java 方法名称的运行时连接等(不太可能),否则您应该能够列出大多数使用 strings 从 .so 引用的 Java 方法和类。使用正则表达式,您可以过滤掉感兴趣的字符串。例如将 strings lib*jni.so | grep 'L[^;]*;' 列出从 .so 引用的所有类(例如 Lcom/somecompany/project/SomeClass;)。将方法与类匹配可能会很棘手,但根据您的需要,这可能就足够了。

  3. 构建一个 Dalvik VM 版本,在每次注册 native 方法时打印一条 logcat 消息。这是最先进、最耗时但最准确的。只需按照 http://source.android.com/source/index.html 上的说明进行操作即可构建 Android 模拟器,但在构建之前,在 dalvik/vm/Jni.cpp 中的 dvmRegisterJNIMethod 末尾启用调试打印所以它变成了:LOGI("JNI-registered %s.%s:%s", clazz->descriptor, methodName, signature);

关于android - 在 JNI 共享库中查找函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10888576/

相关文章:

java - 如何使用Android获取xml中的根元素?

Android:如果更改系统字体大小,应用程序会崩溃

c++ - 在 C++ 中表示 BLOB

java - 使用 Java 连接到受密码保护的 UNC

java - 调用JNI方法时如何获取Android上下文实例?

android - React-Native Android - 如何使用 getRealDimensions(尺寸不起作用)

android - 使我的对话框在所有版本的 android 中看起来一致

c++ - 将 128 位十六进制字符串转换为 base-36 字符串

c++ - 如何在 C# 中用 Swig 包装 UTF-8 编码的 C++ std::strings?

java - OpenCV Java JNIEXPORT 内存管理