JNI 是如何在内存层工作的
How JNI works on the memory level
我有一个 java 文件,它加载 .so 文件并打印来自 .so 文件的结果。我没有 .so 文件的源代码。任何人都可以告诉内存结构中 .so 结果是如何加载的,以及这个 Java class 从哪里读取 .so 生成的结果并将它们打印出来??
你的 .so 有一个 JNI 胶水 class 绑定你所有的 Java 本机方法 (public native void x();) 与编译的本机代码。
我假设它使用 JNI,否则我不知道它是如何工作的。如果它使用 JNI,那么它实际上会使用 JNI 库在 .so 的 Java 堆上创建 Java 对象。查找标记为 "native" 的函数,这些函数直接映射到库中 Java 代码 运行 中的某些内容时调用的函数。
如果您有任何已经用本地语言编写的代码并且不愿意更改它,但您希望在 java 代码中使用本地调用而不是完全重写所有内容 java。 JNI 派上用场了。它将所有特定于平台的实现转换为独立于平台的实现。标准库中对性能和平台敏感的 API 实现允许所有 Java 应用程序访问此功能。
库文件 .so 以这种方式转换。
JNIEnv 包含从本机数据类型到 java 数据类型的所有类型转换。它还支持本地方法调用的适当实现,信号也由 JVM 处理。
Java 是平台独立的本机进程,特定于硬件和操作系统平台的所有平台都通过将本机数据类型和方法调用映射到 java 来实现平台独立。 JNI 使用库文件示例 .so 或 .a 文件执行上述操作
关于JNI映射你可以参考下面的link
http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/types.html
Droidfish Android chess game is written in Java
. But its underlying chess engine Stockfish is written in C++
. At first, I thought there was a JNI
layer that connects these two but there isn't. The C++ stockfish executable is launched, and Java
and C++
communicates via stream.
您可以启动 C++ stockfish 并在命令行中使用此引擎,无需图形界面。
在您的问题中,您的本地 .so
库正在向 stdout/stderr
打印一些内容,而您想在 Java 中读取这些输出?
我有一个 java 文件,它加载 .so 文件并打印来自 .so 文件的结果。我没有 .so 文件的源代码。任何人都可以告诉内存结构中 .so 结果是如何加载的,以及这个 Java class 从哪里读取 .so 生成的结果并将它们打印出来??
你的 .so 有一个 JNI 胶水 class 绑定你所有的 Java 本机方法 (public native void x();) 与编译的本机代码。
我假设它使用 JNI,否则我不知道它是如何工作的。如果它使用 JNI,那么它实际上会使用 JNI 库在 .so 的 Java 堆上创建 Java 对象。查找标记为 "native" 的函数,这些函数直接映射到库中 Java 代码 运行 中的某些内容时调用的函数。
如果您有任何已经用本地语言编写的代码并且不愿意更改它,但您希望在 java 代码中使用本地调用而不是完全重写所有内容 java。 JNI 派上用场了。它将所有特定于平台的实现转换为独立于平台的实现。标准库中对性能和平台敏感的 API 实现允许所有 Java 应用程序访问此功能。 库文件 .so 以这种方式转换。
JNIEnv 包含从本机数据类型到 java 数据类型的所有类型转换。它还支持本地方法调用的适当实现,信号也由 JVM 处理。
Java 是平台独立的本机进程,特定于硬件和操作系统平台的所有平台都通过将本机数据类型和方法调用映射到 java 来实现平台独立。 JNI 使用库文件示例 .so 或 .a 文件执行上述操作
关于JNI映射你可以参考下面的link http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/types.html
Droidfish Android chess game is written in Java
. But its underlying chess engine Stockfish is written in C++
. At first, I thought there was a JNI
layer that connects these two but there isn't. The C++ stockfish executable is launched, and Java
and C++
communicates via stream.
您可以启动 C++ stockfish 并在命令行中使用此引擎,无需图形界面。
在您的问题中,您的本地 .so
库正在向 stdout/stderr
打印一些内容,而您想在 Java 中读取这些输出?