问题标签 [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 管理 DLL 依赖项
我有一个用 Maven 管理其依赖项的 Java 程序。其中一个依赖项是另一个程序的 JNI 包装器。Maven 负责对相关 JAR 文件的引用,但我自己却在搞乱 DLL 文件。
是否有让 Maven 也处理 DLL 的好方法?理想情况下,我希望将 DLL 像 JAR 文件一样加载到我们的本地存储库中。
java - 如何获取已加载的 JNI 库列表?
正如主题所说,Java中有没有办法获取在任何给定时间加载的所有JNI本机库的列表?
java - 如何在 linux 中调试 java system.loadlibrary 错误?
我有一个 Java 程序,它通过我试图在 Linux 上运行的 JNI 调用 C 代码。外部代码由两个 .so 文件组成:一个用于 JNI 绑定(使用 swig 构建),另一个用于实际功能。我在同一个目录中有两个库,并且 LD_LIBRARY_PATH 设置正确。ldd 从命令行运行时没有报告任何问题,但是当我在 Eclipse 编辑器的“运行配置”对话框中将 LD_LIBRARY_PATH 设置为相同的值并尝试执行程序时,会出现以下错误:
java.lang.UnsatisfiedLinkError: [path to libraries]/[JNI binding library].so: [actual code library].so: cannot open shared object file: No such file or directory
这使我相信 JNI 包装器库已成功加载,但是当该库尝试加载包含实际代码的库时会失败。有什么办法可以进一步调试吗?
我将进一步指出,这个问题发生在 eclipse 编辑器本身中,并且我没有尝试将代码打包到 jar 中并在独立的 jvm 实例中运行它。
java - registerNatives() 方法有什么作用?
java中registerNatives()
Object类的私有静态方法有什么作用?
java - 强制 Java 调用我的 C++ 析构函数 (JNI)
我以为以前会问过这个问题,但我在这里找不到...
我使用 SWIG 围绕 C++ 类创建了一个 JNI 包装器。一切都很好,除了 Java 似乎从不调用类的 finalize(),因此,反过来,我的类的析构函数永远不会被调用。该类的析构函数执行一些最终文件 I/O,因此不幸的是,这不仅仅是轻微的内存泄漏。
通过谷歌搜索,似乎没有办法强制 Java 进行 GC 并销毁对象。真的?
我知道我可以操纵我的 SWIG 文件并创建一个调用 C++ 析构函数的 java 函数,但是这个类被最终用户在几种不同的平台/语言中使用,所以添加一个纯 Java 会造成我们的技术不一致作家们不会喜欢的。
java - 关于如何提高 Java String 到 byte[] 转换性能的任何建议?
我继承了一段代码,它大量使用 String -> byte[] 转换,反之亦然,用于一些自制的序列化代码。本质上,Java 对象知道如何将它们的组成部分转换为字符串,然后再转换为字节 []。然后,所述字节数组通过 JNI 传递到 C++ 代码中,该代码将 byte[] 重构为 C++ std::strings 并使用这些代码引导反映 Java 对象的 C++ 对象。还有更多内容,但这是这段代码如何工作的高级视图;通信在两个方向上都是这样工作的,因此 C++ -> Java 转换是我上面提到的 Java -> C++ 转换的镜像。
这段代码的一部分——将 String 实际转换为 byte[]——出乎意料地在分析器中显示为消耗大量 CPU。当然,有很多数据正在传输,但这是一个意想不到的瓶颈。
代码的基本大纲如下:
该功能还有一点点,但不多。上面的函数会为每个 String/Stringified 对象调用一次,并且在将所有成分写入 ByteArrayOutputStream 之后,ByteArrayOutputStream 会转换为 byte[]。通过提取调用将上述内容分解为对分析器更友好的版本convert_me.getBytes()
表明,此函数中超过 90% 的时间都花在了 getBytes() 调用中。
有没有办法提高 getBytes() 调用的性能,或者是否有另一种可能更快的方法来实现相同的转换?
正在转换的对象数量非常大。在仅使用一小部分生产数据的分析运行中,我看到对上述转换函数的调用超过 1000 万次。
由于我们非常接近将项目发布到生产环境中,因此目前无法采用一些解决方法:
- 重写序列化接口,只在 JNI 层传递字符串对象。这是改善情况的明显(对我而言)方法,但它需要对序列化层进行重大重新设计。鉴于我们将在本周早些时候进入 UAT,现在进行这种复杂的更改为时已晚。这是我下一个版本的首要任务,所以它会完成;然而,在那之前我确实需要一个解决方法,但到目前为止代码正在运行,已经使用了多年并且大部分问题都解决了。好吧,除了表演。
- 更改 JVM(当前为 1.5)也不是一种选择。不幸的是,这是安装在客户端机器上的默认 JVM,很遗憾无法更新到 1.6(在这种情况下可能会更快,也可能不会更快)。任何在大型组织工作过的人都可能明白为什么...
- 除此之外,我们已经遇到了内存限制,因此尝试缓存至少较大的字符串及其字节数组表示,虽然是一个潜在的优雅解决方案,但可能会导致比它解决的问题更多的问题
java - java, System.loadlibrary("someDLLFile") 获取未统计的链接错误
我已经将一些 JNI 挂钩写入 C++ 库,并为我的 java 服务器项目创建了一些 DLL 文件。假设 DLL 和 jar 文件位于“C:/server”下的同一文件夹中
我正在使用以下方式访问这些 DLL 文件:
在需要 C++ 代码的类中。
我遇到的问题是当我在自己的机器上运行此服务器时,无论我将“服务器”文件夹放在哪里,一切都正常。但是当我把它交给同事测试时,他们不断得到:
我想让 DLL 文件与 jar 文件位于同一文件夹中,并且不希望有人配置他们的 PATH 变量。
为什么无论文件夹的位置如何,System.loadLibrary() 都可以在我自己的机器上工作,但不能在另一台计算机上工作?
web-applications - .dll 已经加载到另一个类加载器中了吗?
我有一个在 Tomcat 3.2.1 下运行的 webapp,它需要进行 JNI 调用才能访问遗留 C++ 代码中的数据和方法。servlet 在 webapp 启动时加载,作为其init
方法的一部分,该 servlet 将特定于该 webapp 实例的数据集加载到 C++ 数据结构中。
此 servlet 的 Java 代码包含以下内容:
如果只有一个 webapp(我们称之为“webapps/aaa”),一切都会很好。
如果我有第二个 webapp(“webapps/bbb”),除了 C++ 数据结构中使用的数据集之外,它与 webapps/aaa 相同,那么 webapps/aaa 启动得很好,但是当 webapps/bbb 启动时我得到一个错误指出:
我需要为我的每个 web 应用程序拥有一个单独的本机库实例,因为每个实例都需要包含该特定 web 应用程序独有的数据。我搜索了邮件档案并阅读了 Craig McLanahan 解释类加载器层次结构的电子邮件。但是我找不到任何特定于为每个 webapp 加载本机库的唯一实例的东西。
jsp - 带有 JNI 的 Java bean?
我在 java bean 代码中添加了本地方法。
然后我在 System32 文件夹中复制了 .dll 文件。
在 JSP 中使用 javabean 时。
它给出了一个错误:
HTTP 状态 500 -
类型异常报告
信息
描述 服务器遇到一个内部错误 () 阻止它完成这个请求。
例外
根本原因
根本原因
note Apache Tomcat/6.0.20 日志中提供了根本原因的完整堆栈跟踪。Apache Tomcat/6.0.20
Java bean 代码: