JNI如何在内存级别上工作

时间:2017-06-29 17:45:16

标签: android android-ndk java-native-interface jnienv

我有一个java文件,它加载.so文件并打印来自.so文件的结果。我没有.so文件的源代码。任何人都可以告诉内存结构如何。所以结果被加载,从这个Java类读取.so生成的结果并打印出来的结果?

4 个答案:

答案 0 :(得分:0)

你的.so有一个JNI粘合类,它将所有Java本机方法(public native void x();)与编译的本机代码绑定在一起。

答案 1 :(得分:0)

我假设它使用JNI,否则我不知道它是如何工作的。如果它使用JNI,那么它实际上使用JNI库在.so中的Java堆上创建Java对象。查找标记为“native”的函数,这些函数直接映射到函数中,以便在Java代码在库中运行时调用。

答案 2 :(得分:0)

如果你有任何代码已经用母语编写并且不愿意更改它,但你想在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

答案 3 :(得分:0)

Droidfish Android chess gameJava编写。但是其基础象棋引擎StockfishC++编写。起初,我以为有一个JNI层将这两个连接在一起,但没有。 C ++ stockfish可执行文件已启动,并且JavaC++通过stream进行通信。

您可以启动C ++ stockfish并在命令行中使用此引擎,而无需图形界面。

在您的问题中,您的本机.so库正在将某些内容打印到stdout/stderr上,并且您想用Java阅读这些输出?