问题标签 [java-native-interface]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
408 浏览

java - 如何从 C 进程中启动 Java?

我想将一些基于 Java(实际上是Clojure)的事件处理程序添加到一个巨大的遗留 C 应用程序中。执行此操作的最直接且易于维护的方法是什么?我希望 Java 类与 C 代码在同一进程中运行。这甚至可能吗?

0 投票
4 回答
1034 浏览

java - 有没有办法使用 JNI 从 Java 调用 C++ 的 STL 库?

有没有办法从 JNI 调用 STL 库,我相信 JNI 为本地调用提供了类似 C 的接口,我们如何为 C++ 模板库实现这一点?

0 投票
3 回答
2208 浏览

java - JNI 与 Runtime.exec()

我有两个选择——我可以使用 JNI 或使用 Runtime.exec 来执行 C++ 库。

C++ 程序是 CPU 密集型和长时间运行的,即某些调用可能需要几个小时才能返回。

各自的优缺点是什么?我应该采用哪种方法?

0 投票
2 回答
1403 浏览

java - 你知道任何包装常见 Linux OS API 的 JNI 包装器工具包或库吗?

我正在寻找一个库或工具包(所以我不必编写它),它将允许我在 Linux 中执行以下常见操作:

  • 获取用户名的 uid。
  • 获取用户/组成员信息。
  • 获取有关磁盘驱动器上可用空间的信息。
  • 任何其他可能有用的 API 调用通常在 Java 中不可用,因为它们破坏了可移植性。

有没有人有任何想法?

0 投票
2 回答
1039 浏览

java - Java:在 jni 调用中,本地代码的错误通常如何处理?

我已经用谷歌搜索了一下,并没有真正找到我的问题的好答案:从本机 jni 代码将错误信​​息传递回 java 的惯用方法是什么?

我通常会选择一个设计并使用它,但是这个代码每 5 毫秒调用一次,(大约),所以我想我会问是否有一种习惯的“干净/高效”的方式来做到这一点。

在我看来,我有四个明显的选择:

  1. 在每次调用时,在 java 中创建一个“错误返回”对象并将其传递给 JNI。如果有问题,本机代码会在此对象中填写错误描述,而 java 代码会在返回时对其进行检查。由于错误并不常见,这会为 GC 清理创建大量对象,其中 99.99% 是不必要的。

  2. 与 #1 类似,在 java 类中创建一些单一的“错误返回”对象,该对象一遍又一遍地传递给每个方法调用。在每次返回的 java 代码中检查它是否有错误。这对我来说似乎很狡猾,但也许这是正确的选择?

  3. 在本机代码中创建一个包含错误描述的对象(如果适用),并将其作为返回值传回给 java.util 。在java中调用之后,检查返回是否为null。这似乎没有#1那么浪费,但似乎有点尴尬。

  4. 只需在 jni 方法上构建一个整数返回值,并传回一个与本机代码的“退出”值相对应的 int。枚举 Java 映射中所有可能的本机退出状态。将返回值与“0”进行比较,并在必要时在此映射中查找错误。这似乎比其他方法更有效,但似乎更笨拙,因为本地代码的更改需要有人返回并更新“错误表”。

我觉得好像我错过了一些明显的东西......那里有一位大师可以提供任何见解吗?

谢谢!

0 投票
2 回答
2295 浏览

c++ - JNI 与 C++ 对象实例

我刚刚开始了一份新工作。在这里,我们是使用 JNI(用于桥接 C++/Java)的新手。我是 JNI 的新手,所以请原谅我的菜鸟 :)

在我们的 (win32) Java 应用程序中,我们正在加载一个 C++ DLL。在 Java 端,我们有几个“SomeJClass”实例,每个实例都需要访问 DLL 端对应的“SomeCClass”实例。DLL 公开诸如 GlobalDoSomethingInC() 之类的入口点。这里我必须调用Doer::DoSomethingInC()的实例方法。所以我需要一种平滑的方式来映射各自的 this 指针。当 DLL 线程发现需要通知相应 Java 实例的有趣内容时,我还需要执行相同的映射。

我可以想到几种解决方案,但我不太喜欢它们。我的问题是,有没有比这更好的方法?

1 Java 调用 C:GetNewInstance()。这将返回一个实际上是指向新 C 实例的指针的 int。Java 将其存储在 m_myCInstance 中。然后 Java 调用 GlobalDoSomethingInC() 和 1a

1b 或:

2 对于从 C 调用到 Java,事情看起来,也许,更好

我想还不错。但是存储对象引用确实很安全。 我的意思是:当 GC 移动对象时会发生什么?

3 我们目前的解决方案确实“有效”。但它属于http://www.codinghorror.com/blog/ :)

谢谢

0 投票
3 回答
3251 浏览

java - 无法通过 JNI 加载 JVM 时如何收到错误消息?

我想检索一条错误消息,解释为什么 jvm 无法加载。从此处提供的示例中:

http://java.sun.com/docs/books/jni/html/invoke.html

我提取了这个例子:

在我的具体情况下,我在 vm_args 中提供了无效的参数,并希望看到我在命令行上得到什么:“无法识别的选项:-foo=bar”

在进一步测试中,jvm 似乎正在将我想要的消息放入 stdout 或 stderr。我相信我需要捕获 stdout 和 stderr 才能得到我正在寻找的错误(当然,除非有更简单的方法)。我正在用 C++ 编码,所以如果有人可以展示一种将错误捕获到字符串流中的方法,那将是理想的。

谢谢,兰迪

0 投票
3 回答
15219 浏览

java - Java中的事件监听器没有应用程序有焦点?(全局按键检测)

我一直在寻找一段时间,每个人似乎都认为仅使用 Java 是不可能的,所以我会试一试;)

有没有办法让我的 Java 应用程序监听事件(特别是关键事件),而另一个不相关的应用程序具有窗口焦点?在我的情况下,我希望检测用户何时按下键盘上的“暂停”键,即使我的 Java 应用程序没有焦点。

我听说有人提到唯一的方法是编写一些 C 代码并使用 JNI。只是好奇是否有人知道避免这种情况的方法?或者,如果没有,至少是一个关于 c/JNI 东西的非常好的教程?

谢谢

0 投票
2 回答
6693 浏览

java - 我需要清理传递给 NewStringUTF 的 char* 吗?

我认为是的,但我发现的前 12 个示例都做了一些不具说明性的事情,例如

所以为了后代我会问:这很糟糕,是吗?

...并且应该是:

0 投票
3 回答
4905 浏览

java - 通过 JNI C 代码将 PNG 图像作为 BufferedImage 加载到 Java 中

我有以下问题。我有 C 代码,它获取 PNG 图像作为基本的原始数据并将其保存在内存中。我希望通过使用 JNI 将这些原始数据转换为 Java 中的 BufferedImage。有没有人知道这样做的任何方式或以前这样做过?