java - 在不使用 JNI 的情况下从 Java 调用 native 函数(使用堆栈操作)

标签 java c jvm embedded

我目前正在制作一个在嵌入式设备(POS 终端)上运行的 Java 应用程序。 此设备具有制造商特定的虚拟机。

与硬件交互的函数定义在这个虚拟的C文件中 机器的来源(在配置文件 AFAIK 中)。

我无法从我的 java 代码中调用这些函数,因为根据官方文档,虚拟机既不支持 JNI 也不支持 KNI,它只支持“堆栈操作”作为一种连接 C 和 java 代码的方法。

据我所知, native 函数的参数是使用堆栈传递的。在调用函数之前推送参数并将它们弹出到函数内部(原型(prototype)具有无效参数)。 我想应该做类似的事情来调用函数,也许与调用堆栈有关?

真正的问题是,如何使用“堆栈操作”连接 C 和 java?

更新:要调用的函数示例(C 代码)它在设备屏幕上打印一条消息。

void PrintAt(void)
{
    Array msg = popStackAsType(Array);
    int y = popStack();
    int x = popStack();
    NativePrint(x,y,msg->bdata);
}

最佳答案

您实际上无法期望这样做,因为您无法控制堆栈。 JVM 控制堆栈,任何所谓的堆栈操作都只是一种卑鄙的 hack。如果没有 JNI 或类似的东西,您最好的解决方案可能是在单独的进程中执行 C 代码并使用某种形式的 IPC 与其通信。

关于java - 在不使用 JNI 的情况下从 Java 调用 native 函数(使用堆栈操作),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9843616/

相关文章:

java - 持久化 JPA 域对象的良好设计

java - 在 Java 中运行时省略实例字段

java - Java中唯一标识文件

java - Java 中的字符串替换

java - Maven 不断尝试连接到不存在的 Intranet 存储库站点

java - 我的应用程序有 128MB 堆,但使用 1.6GB 实际 RAM。我怎样才能找到 1.4GB 的去向?

c - 设置共享变量时应该使用临界区还是内存屏障?

c - C 中的 NULL 混淆

c - Getchar在c中只保存1个字符

java - Groovy在java注释中插入多行字符串