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

java - 从 java 代码中轻松使用 windows 静态库(最好使用 JNA)

我必须使用*.libjava 代码中的一些静态 Windows 库(),我可以编写 C++ JNI 包装器,但我宁愿不这样做(没有 C++ 经验)。

使用它的最简单(最少的开发工作量)方式是什么,性能并不重要,因为该代码只会获取一些数据,很可能会在 JAVA 端进行处理。

很可能我会使用JNA,但 AFAIK 它需要动态库,而我有静态库。

我还了关于将静态库转换为动态库的问题。

0 投票
1 回答
7320 浏览

java - 使用 maven 通过 JNI 构建/部署/使用项目

我正在尝试使用 maven 构建一个依赖于 OpenCV 计算机视觉库的 JNI 包装器的项目。我已经能够通过使用 FreeHEP 的 NAR maven 插件在此处“maven-ize”OpenCV 包装器:http : //ubaa.net/shared/processing/opencv/,但该插件的文档有些缺乏。

我已经能够创建一个依赖于 OpenCV jni 项目(我称之为 OpenCVJava)的项目(imagedetect)。imagedetect 将编译,但是,任何测试、集成测试或包目标都会失败,并显示有关 java.library.path 中缺少库的错误。

这尤其令人沮丧——我知道解决这个问题的唯一方法是以某种方式追踪 opencv 库的 .nar 文件,手动提取它们,设置 java.library.path,然后调用 gnaraly java 命令来实际执行具有正确类路径/库路径的测试/应用程序。这是行不通的——特别是如果这个问题持续存在于传递依赖中。

我怎样才能使这个构建/测试/执行系统更干净?我没有使用 FreeHEP,但我想坚持使用 maven,因为它使我们最常见的用例变得更加简单。

FreeHEP Nar 插件:http: //java.freehep.org/freehep-nar-plugin/intro.html

0 投票
2 回答
8639 浏览

java - 通过 JNI 将双字节 (WCHAR) 字符串从 C++ 传递到 Java

我有一个通过 JNI 使用 C++ DLL 的 Java 应用程序。一些 DLL 的方法采用字符串参数,其中一些方法也返回包含字符串的对象。

目前 DLL 不支持 Unicode,因此字符串处理相当简单:

  • Java 调用 String.getBytes() 并将结果数组传递给 DLL,DLL 只是将数据视为 char*。
  • DLL 使用 NewStringUTF() 从 const char* 创建 jstring。

我现在正在修改 DLL 以支持 Unicode,切换到使用 TCHAR 类型(定义 UNICODE 时使用 windows 的 WCHAR 数据类型)。修改 DLL 进展顺利,但我不确定如何修改代码的 JNI 部分。

我现在唯一能想到的是:

  • Java 调用 String.getBytes(String charsetName) 并将结果数组传递给 DLL,DLL 将数据视为 wchar_t*。
  • DLL 不再创建字符串,而是将 jbyteArrays 与原始字符串数据一起传递。Java 使用 String(byte[] bytes, String charsetName) 构造函数来实际创建字符串。

这种方法的唯一问题是我不确定要使用什么字符集名称。WCHAR 的长度为 2 字节,所以我很确定它是 UTF-16,但在 java 端有 3 个可能性。UTF-16、UTF-16BE 和 UTF-16LE。我还没有找到任何文档告诉我字节顺序是什么,但我可能可以通过一些快速测试来弄清楚。

有没有更好的办法?如果可能的话,我想继续在 DLL 中构造 jstring 对象,因为这样我就不必修改这些方法的任何用法。但是,NewString JNI 方法不采用字符集标识符。

0 投票
1 回答
1888 浏览

java-native-interface - 试图通过 JNI 将原始图像数据读入 Java

我正在使用 JNI 获取以下格式的原始图像数据:

图像数据以线性数组中每个像素的 DATA32(32 位)格式返回,从图像的左上角到右下角,每行从左到右排列。每个像素都有高 8 位作为 alpha 通道,低 8 位是蓝色通道 - 所以一个像素的位是 ARGB(从最高有效到最低有效,每个通道 8 位)。您必须在某个时候将数据放回原处。

DATA32 格式本质上是 C 中的无符号整数。

所以我获得了一个 int[] 数组,然后尝试通过它创建一个缓冲图像

f 是具有像素数据的数组。

根据 Java 文档,这应该可以工作,因为 BufferedImage.TYPE_INT_ARGB 是:

表示包含 8 位 RGBA 颜色分量的图像,这些分量被打包到整数像素中。该图像具有带 alpha 的 DirectColorModel。此图像中的颜色数据被认为没有与 alpha 进行预乘。当此类型作为 BufferedImage 构造函数的 imageType 参数时,创建的图像与 JDK1.1 及更早版本中创建的图像一致。

除非通过 8 位 RGBA,否则它们意味着加在一起的所有组件都以 8 位编码?但这是不可能的。

此代码确实有效,但生成的图像与它应该生成的图像完全不同。有成吨的文物。任何人都可以在这里看到明显错误的东西吗?

注意我获得了我的像素数据

在我的 C 代码中,使用库 imlib2 和 api http://docs.enlightenment.org/api/imlib2/html/imlib2_8c.html#17817446139a645cc017e9f79124e5a2

0 投票
5 回答
57728 浏览

java - 我应该如何为 JNI 加载本机库以避免 UnsatisfiedLinkError?

我想在 Ubuntu 8.10 上使用 JNI,使用 Eclipse 和 gcc(如果有的话,这是 Ubuntu 的标准)。

尽管 make 文件成功创建它,但我似乎无法加载我的库。

主要的Java类如下:

我的make文件就是这样;

其余代码 (Hello.c) 看起来像人们想的那样。

我得到的错误如下;

如果我使用显式路径:

然后它可以工作,但如果可能的话,我宁愿不使用显式路径。

0 投票
3 回答
7066 浏览

java - 如何调试 JNI/C 库?

我们这里有使用 Java JNI 调用 C 库中的函数的系统。一切都在 Solaris 上运行。

我在字符串编码的某个地方遇到问题。用 C 编写的函数返回一个阿拉伯字符,但 JNI 方法接收具有另一种编码的字符串。我已经尝试设置 $NLS_LANG 和 vm 参数以相同的方式进行编码,但没有任何效果。所以我需要能够同时调试 C 代码和 Java JNI。

调试它的最佳方法是什么?

0 投票
4 回答
1972 浏览

java - lotus-notes 插件中的 UnsatisfiedLinkError

我们在笔记插件中遇到了一个 dll 问题。

当我们调用它时:NotesFactory.createSession();

我们得到这个错误:

无法创建视图:nlsxbe(文件名或扩展名太长。java.lang.UnsatisfiedLinkError: nlsxbe(文件名或扩展名太长。)在 java.lang.ClassLoader.loadLibraryWithPath(ClassLoader.java:952) 在 java。 lang.ClassLoader.loadLibraryWithClassLoader(ClassLoader.java:921) at java.lang.System.loadLibrary(System.java:452) at lotus.domino.NotesThread.load(Unknown Source) at lotus.domino.NotesThread.checkLoaded(Unknown Source ) 在 com.atempo.adam.lotus.plugin.views.TopicView.createPartControl(TopicView.java:609) 的 lotus.domino.NotesThread.sinitThread(Unknown Source)

NotesFactory 位于 Notes.jar 中,我们已将其包含在依赖项选项卡中的“plugin.xml”中。(依赖是:“com.ibm.notes.java.api”)。

jar 的路径是:“C:\Archivos de programa\IBM\Lotus\Notes\framework\rcp\eclipse\plugins\com.ibm.rcp.j2se.win32.x86_1.5.0.SR4-200707311521\jre\lib \Notes.jar" 超过 128 个字符。如果我们在“c:\program files\IBM”而不是“C:\Archivos de programa\IBM”中安装注释,则生成的路径短于 128,我们不会收到错误。

我们也尝试将 nlsxbe.dll 复制到 WIN\System32 或使用 regsvr32 命令注册 nlsxbe.dll,但我们得到相同的错误。

版本是:Lotus notes 8.0,Revision 20070803.1143 java 1.5.0

谢谢

0 投票
1 回答
3930 浏览

java - 使用 JNI 从 Java 代码中检索字符串值的内存泄漏

我正在使用 GetStringUTFChars 使用 JNI 从 java 代码中检索字符串的值,并使用 ReleaseStringUTFChars 释放字符串。当代码在 JRE 1.4 上运行时,没有内存泄漏,但如果相同的代码在 JRE 1.5 或更高版本上运行,则内存会增加。这是代码的一部分

我无法理解泄漏的原因。有人可以帮忙吗?


这是因为如果我注释其余代码但留下这部分,则会发生内存泄漏。这是我正在使用的代码的一部分

在上面的一个中,如果我评论 ///// 之间的部分,我看不到任何内存泄漏。

0 投票
3 回答
899 浏览

java - 调用内置的 java 本地方法

是否可以调用JVM 内置的native 代码,即java.lang 和java.io 中的各个类调用的代码?换句话说,你能绕过内置的 java API 来访问各种系统级调用,例如文件系统访问吗?我知道我可以通过构建自己的本机代码库并通过 JNI 调用它来做到这一点,但是对于已经内置到 JVM 中的功能不需要额外的本机库会很优雅。

0 投票
3 回答
379 浏览

java - 带有任意 C 代码的 Java 原生接口

我有一个提供的 .dll,我需要使用 java 与它交互。

我是否必须重写 C 才能使用 jni.h 中提供的 JNI 类型?如 java sun 的 jni 示例所示。否则,我如何声明我的 java 函数的本机函数来传递和接收指针?

谢谢