我有一个 java 文件,它加载 .so 文件并打印来自 .so 文件的结果。我没有 .so 文件的源代码。谁能告诉我如何在内存结构中加载 .so 结果以及这个 Java 类从哪里读取 .so 生成的结果并将它们打印出来?
4 回答
您的 .so 有一个 JNI 粘合类,它将所有 Java 本机方法(公共本机 void x();)与已编译的本机代码绑定在一起。
我假设它使用 JNI,否则我不知道它是如何工作的。如果它使用 JNI,那么它实际上会使用 JNI 库在 .so 中的 Java 堆上创建 Java 对象。查找标记为“本机”的函数,这些函数直接映射到在 Java 代码运行库中的某些内容时调用的函数。
Droidfish Android 国际象棋游戏是用Java
. 但它的底层国际象棋引擎Stockfish是用C++
. 起初,我以为有JNI
一层连接这两者,但没有。启动 C++ stockfish 可执行文件,并Java
通过C++
stream 进行通信。
您可以在命令行中启动 C++ stockfish 并使用该引擎,无需图形界面。
在您的问题中,您的本机.so
库正在打印某些内容,stdout/stderr
并且您想用 Java 读取这些输出?
如果您有任何已经用本地语言编写的代码并且不愿意更改它,但您希望在您的 java 代码中使用本地调用,而不是完全重写所有 java。JNI 派上用场了。它将所有特定于平台的实现转换为独立于平台的。标准库中对性能和平台敏感的 API 实现允许所有 Java 应用程序访问此功能。库文件 .so 以这种方式进行转换。
JNIEnv 包含从本地数据类型到 java 数据类型的所有类型转换。它还支持本地方法调用的合适实现,信号也由 JVM 处理。
Java 是特定于硬件和操作系统平台的平台独立本机进程,它们都通过将本机数据类型和方法调用映射到 java 来实现平台独立。JNI 使用库文件示例 .so 或 .a 文件执行上述操作
对于 JNI 映射,您可以参考以下链接 http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/types.html