加载系统库不允许在包中使用函数

Loading system Library does not allow functions to be used when in a package

我有点奇怪。

我正在尝试在我的代码中使用 .dll 库,并且有一个简单的应用程序可以使用

加载该库
System.loadLibrary(libraryName);

当我的 .java 文件在默认包中时,它与项目主文件夹中的 .dll 文件完美运行。一旦我尝试将文件放入包中,代码就可以找到并加载库(它在构建时不会给出不满意的 link 错误)但是当你从它调用一个函数时,它会给出错误

java.lang.UnsatisfiedLinkError: main.MyClass.MyFunction(II)Z

在类中定义

public native boolean MyFunction(int A, int B);

我试过将库移动到不同的文件夹并相应地引用并将其放入 System32 文件夹,但仍然没有成功。当它在默认包中而不是在命名包中时它会起作用似乎很奇怪。

我想引用它,因此需要将它从默认包中删除。有什么想法吗?

当您更改包时,您需要再次通过运行 javah re-create JNI 的C headers。执行此操作时,您会注意到 JNI 的 C 函数名称已更改 - 它们现在包括包名称。

基本上,因为C不支持命名空间,为了防止名称冲突,包名也成为C函数符号名的一部分。

如果更改Java中JNI方法的包,则需要重命名C函数并重新编译DLL。