问题标签 [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.
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
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 方法不采用字符集标识符。
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
java - 我应该如何为 JNI 加载本机库以避免 UnsatisfiedLinkError?
我想在 Ubuntu 8.10 上使用 JNI,使用 Eclipse 和 gcc(如果有的话,这是 Ubuntu 的标准)。
尽管 make 文件成功创建它,但我似乎无法加载我的库。
主要的Java类如下:
我的make文件就是这样;
其余代码 (Hello.c) 看起来像人们想的那样。
我得到的错误如下;
如果我使用显式路径:
然后它可以工作,但如果可能的话,我宁愿不使用显式路径。
java - 如何调试 JNI/C 库?
我们这里有使用 Java JNI 调用 C 库中的函数的系统。一切都在 Solaris 上运行。
我在字符串编码的某个地方遇到问题。用 C 编写的函数返回一个阿拉伯字符,但 JNI 方法接收具有另一种编码的字符串。我已经尝试设置 $NLS_LANG 和 vm 参数以相同的方式进行编码,但没有任何效果。所以我需要能够同时调试 C 代码和 Java JNI。
调试它的最佳方法是什么?
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
谢谢
java - 使用 JNI 从 Java 代码中检索字符串值的内存泄漏
我正在使用 GetStringUTFChars 使用 JNI 从 java 代码中检索字符串的值,并使用 ReleaseStringUTFChars 释放字符串。当代码在 JRE 1.4 上运行时,没有内存泄漏,但如果相同的代码在 JRE 1.5 或更高版本上运行,则内存会增加。这是代码的一部分
我无法理解泄漏的原因。有人可以帮忙吗?
这是因为如果我注释其余代码但留下这部分,则会发生内存泄漏。这是我正在使用的代码的一部分
在上面的一个中,如果我评论 ///// 之间的部分,我看不到任何内存泄漏。
java - 调用内置的 java 本地方法
是否可以调用JVM 内置的native 代码,即java.lang 和java.io 中的各个类调用的代码?换句话说,你能绕过内置的 java API 来访问各种系统级调用,例如文件系统访问吗?我知道我可以通过构建自己的本机代码库并通过 JNI 调用它来做到这一点,但是对于已经内置到 JVM 中的功能不需要额外的本机库会很优雅。
java - 带有任意 C 代码的 Java 原生接口
我有一个提供的 .dll,我需要使用 java 与它交互。
我是否必须重写 C 才能使用 jni.h 中提供的 JNI 类型?如 java sun 的 jni 示例所示。否则,我如何声明我的 java 函数的本机函数来传递和接收指针?
谢谢