首页 > 解决方案 > 我可以在 Java 中控制 JNI 本机方法调用名称吗?

问题描述

我遇到了一个问题。我将 Chilkat 用于 Java,据我所知,没有任何 Maven 回购。因为它是一个双组件库 - 我需要通过 System.load() 注入 .dll。这部分对我来说很清楚,但它们也提供了一些东西,比如包装器,它调用 .dll 中的方法。

所以,我不想将他们的 .jar 导入我的项目,但是,然后我自己调用本机方法,它因 java.lang.UnsatisfiedLinkError 而失败。因为,然后 java 尝试调用一个本地方法,它在它的名称的开头添加了一些东西。例如:如果我在我的包中声明了本机方法,那么它将被调用,java 会将所有包层次结构名称添加到它的名称中。

我可以以某种方式直接通过其名称调用本机方法,而无需任何运行时“适应”吗?

标签: javanativejnienvjniwrapper

解决方案


javac可以生成您可能正在寻找的绑定... DLL 导出查看器(以及其他几个)可以列出导出的方法。或者对于 SO,只需使用dumpbin /EXPORTS ./filename. 方法名称会在运行时更改是不现实的,这只会在构建时混淆它们时发生一次 - 这通常会排除所有需要保持可访问性(用于反射)的对象。

只需启动一个新的 JNI 项目并了解它如何在大大降低复杂性的情况下工作。仍然有机会,这个 JAR 可能会在本机程序集中传递许可信息 - 或者本机程序集为 JAR 执行加密功能。商业图书馆不应被视为开源 - 首先我会阅读他们的许可条款。


推荐阅读