问题标签 [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 投票
1 回答
2064 浏览

java - 什么是 xdoclet?(从 C 程序员的角度来看)

来自一个 C-guy 的问题,他必须使用一些通过 JNI 连接到我的 C 代码的 java 代码。

我必须在构建系统上工作,并且我正在尝试将其从 shell 脚本更改为正确的 makefile。对于 C 部分来说这很容易,但 java 方面不知何故涉及 xdoclet 的东西。

我还没有发现 xdoclet 的全部内容,我想了解这一切。

我做了我的谷歌研究,但我知道那东西是做什么的。对我来说,如果你已经熟悉这个问题并且你有 10 年的 Java 工作经验,你似乎只有机会了解官方文档。

您能否解释一下 xdoclet 的作用?

顺便说一句 - 我也提到了 C。我也喜欢面向对象的编程。无需向我解释类或继承的基础知识(如果需要了解 xdoclet)。


编辑:大约十年前,我问过这个问题是针对 IT 的。我仍然不知道 xdoclet 是什么,但这个问题获得了超过一千次的浏览量。我想看到一些 Java 人来插话,最后把事情弄清楚。

0 投票
3 回答
28056 浏览

linux - 用于创建指向共享库的符号链接的 Bash 脚本

我认为这个问题对于你的 shell 脚本怪物来说是相当容易的。

我正在寻找通过 bash shell 脚本创建指向 Unix 共享库的符号链接的最优雅和最短的方法。

我需要从共享库文件列表开始,例如“libmythings.so.1.1,libotherthings.so.5.11”,获取创建的符号链接,例如:

库文件位于包含其他文件(例如其他 shell 脚本)的目录中。

编辑:嗯,“ldconfig -nN”。可以正常工作,但我还需要没有在“.so”之后附加库的主要编号的链接,至少是其中一个库,因为一个或多个库是来自 Java 的 JNI 调用的入口点,所以当一个库通过 System.loadlibrary("libraryname") 实例化它需要一个名为“libraryname.so”的库,而不是“libraryname.so.X”。

如果有针对 Java 部分的解决方法,那么仅使用 ldconfig -nN 的解决方案就可以工作。

0 投票
11 回答
2449 浏览

java - 作为 Java 开发人员,C 还是 C++?

在过去的 5 年里,我一直在专业地编写 Java。最近,我不得不深入研究 JNI 来调用一些特定于 Windows 的函数。

这段经历凸显了我对 C(或 C++)语言的糟糕掌握。我对 C 的唯一介绍是我 11 年前在高中读过的一本简短的“傻瓜”书。

我知道这两种语言在那个时间框架内都有进步,尤其是 C++ 和标准库。

我适合学习 C 或 C++ 吗?哪些书最好?

人们对 Windows 编程也有任何建议吗?我可以很好地阅读 MSDN 以找出某些 API 调用,但我感觉我错过了关于“大局”的东西。

谢谢

0 投票
3 回答
2407 浏览

java - 通过命令行调用与 JNI

我需要从 Java 应用程序服务器调用 tesseract OCR(它是 C++ 中的一个开源库,用于进行光学字符识别)。现在很容易使用 Runtime.exec() 运行可执行文件。基本逻辑是

  1. 将当前保存在内存中的图像保存到文件(.tif)
  2. 将图像文件名传递给 tesseract 命令行程序。
  3. 使用 FileReader 从 Java 读取输出文本文件。

通过为 Tesseract 编写 JNI 包装器,我可能会在性能方面获得多少改进?不幸的是,没有在 Linux 中工作的开源 JNI 包装器。我必须自己做,并且想知道收益是否值得开发成本。

0 投票
4 回答
3926 浏览

java - 字节流/C/JNI

C API 实现中通常使用哪些数据类型来存储字节流?如何将此类型转换为 jbyteArray?

0 投票
3 回答
4356 浏览

java - 将指针从java传递到native

我正在制作一个 DLL 库的接口,所以我可以将它与 Java 一起使用。我需要我的本机函数来修改 jlong​​ 参数的值。就像参数是通过引用传递的。我的 Java 方法必须具有与此处显示的本机函数 MPUSBWrite 完全相同的参数。

实际无效代码示例: MPUSBWrite 获取其第 4 个参数作为参考并修改其值。当我读取 pLength 传递的变量时,我总是得到 0。

爪哇:

本机 C++:

有没有办法我的 C++ 代码通过引用修改 pLength 变量的值?

0 投票
2 回答
1304 浏览

air - 如何从 C 程序将 AIR 运行时加载为进程内共享库

我想按照 java.exe 的方式用 C 语言构建一个特殊的 AIR 启动程序。

我用进程查看器查看了运行 AIR 程序,并且能够找到正在使用的 AIR 运行时 DLL。AIR 程序与 Java 的不同之处在于,它们作为特定于平台的可执行文件安装,一旦启动,它们就会将 AIR 运行时绑定为进程内共享库(用户双击它们的图标)。

好吧,我想制作一个类似于 java.exe 的 AIR 启动器。

java.exe 作为平台操作系统进程启动,它作为进程内共享库绑定到 Java JVM 运行时 (JRE)。要执行的 java 应用程序被指定为 java.exe 的命令行参数。一旦 java.exe 运行并且 JVM 完全正常运行,指定的 java 应用程序类将由 JVM 类加载器加载以执行。然后,指定的 Java 应用程序接管,在某种意义上“劫持”了 java.exe 的进程。当然,指定的 java 应用程序会在任何进程列表中显示为托管它的 java.exe 程序。

我想让 AIR 应用程序启动像这样工作。为什么?所以我可以探索破解 AIR 的方法,也许可以克服它的许多缺陷。例如,对于初学者,我想通过一些新的 API 来扩展 AIR 运行时体验,这些 API 可用于正在运行的 AIR 应用程序。

我的首要任务是:

  • 实现与 .NET PInvoke 相当的 ActionScript3 到 C 的绑定接口
  • 添加一个用于启动进程的 API,该 API 与 Java SE 中的 API 相当(Runtime.exec、ProcessBuilder、Process)
  • 添加对 AIR 应用程序的支持,以便能够与 stdin、stdout、stderr 交互。奇怪的是,尽管 Adob​​e 在 AIR 中添加了对本地文件访问的支持,但它们却省略了与这些标准文件管道的交互(但它们可以在 AIR 支持的任何操作系统平台上找到)。
  • 通过 stdin、stdout、stderr 实现对 AMF 的支持——因此 AIR(或 Java 或任何支持 AMF 的语言)应用程序可以通过交换 AMF 对象来进行通信。这将为 AIR 添加一点微软的 PowerShell。

目前 Merapi 提供了一个带有 Java 的 AMF 桥接器,从而证明了它的功效。唉,Merapi 必须使用 localhost 端口和套接字来进行进程间通信——相对于使用 stdin/stdout/stderr 进程间管道,这是一种笨拙的方式。

0 投票
7 回答
8657 浏览

java - 内存映射文件的性能/稳定性 - Native 或 MappedByteBuffer - 与普通 ol' FileOutputStream

我支持使用平面文件(纯文本)进行持久性的遗留 Java 应用程序。由于应用程序的性质,这些文件的大小可以达到每天 100s MB,而应用程序性能的限制因素通常是文件 IO。目前,应用程序使用普通的 java.io.FileOutputStream 将数据写入磁盘。

最近,我们有几位开发人员断言,使用内存映射文件、以本机代码 (C/C++) 实现并通过 JNI 访问,将提供更高的性能。但是,FileOutputStream 已经将本机方法用于其核心方法(即 write(byte[])),因此在没有硬数据或至少没有轶事证据的情况下,这似乎是一个脆弱的假设。

我对此有几个问题:

  1. 这个说法真的是真的吗? 与 Java 的 FileOutputStream 相比,内存映射文件是否总是提供更快的 IO?

  2. 从 FileChannel 访问的 MappedByteBuffer 类是否提供与通过 JNI 访问的本机内存映射文件库相同的功能?MappedByteBuffer 缺少什么可能导致您使用 JNI 解决方案?

  3. 在生产应用程序中使用内存映射文件进行磁盘 IO 有哪些风险?也就是说,具有持续正常运行时间且重启次数最少的应用程序(最多每月一次)。来自生产应用程序(Java 或其他)的真实轶事优先。

问题 #3 很重要——我可以通过编写一个“玩具”应用程序来部分回答这个问题,该应用程序使用上述各种选项对 IO 进行性能测试,但是通过发布到 SO,我希望能够了解真实世界的轶事/数据.

[编辑] 澄清 - 每天运行,应用程序创建多个文件,大小范围从 100MB 到 1 gig。总的来说,该应用程序可能每天要写出多个演出数据。

0 投票
2 回答
26236 浏览

java - Linux 中的 java.lang.UnsatisfiedLinkError

我已经设法进入一台 linux 机器来尝试这个答案中建议的 HotKey 库。

我已经编译了示例代码,现在我运行程序并收到以下消息:

我知道如何在 Windows 中处理这个问题(只需将 DLL 添加到 PATH env var 中),但我对 linux 不太确定。

我读过一些关于 LD_LIBRARY_PATH 和其他一些环境变量的东西,但我可以让它工作。

有什么建议吗?

编辑

在 mmyers 的支持下确定问题并阅读此线程其他.

我可以告诉:

我的系统是:Linux 2.6.18-53.el5

我的 GCC 版本是(是):

gcc-c++-4.1.2-14.el5

gcc-gfortran-4.1.2-14.el5

libgcc-4.1.2-14.el5

gcc-4.1.2-14.el5

问题是我需要 gcc 4.2.0

Aaand 显然我的系统没有 gcc 4.2.0。

我想我将不得不等待它来或作者在以前的版本中重新编译它。

mmyers,非常感谢您的帮助。

0 投票
5 回答
19908 浏览

java - 什么是 Java 中的本机实现?

如果我们查看 Java Object 类,那么我们可以找到一些方法,例如:

这些本地人是什么?这些方法是如何工作的?