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

时间:2015-01-08 15:38:44

标签: java eclipse dll loadlibrary

我有点奇怪。

我试图在我的代码中使用.dll库,并有一个简单的应用程序,使用

加载库
System.loadLibrary(libraryName);

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

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

在类

中定义
public native boolean MyFunction(int A, int B);

我已经尝试将库移动到不同的文件夹并相应地进行引用并将其放入System32文件夹但仍然没有运气。它在默认包中但在命名包中不起作用似乎很奇怪。

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

1 个答案:

答案 0 :(得分:0)

更改包时,需要再次运行javah为JNI重新创建C头。执行此操作时,您会注意到JNI的C函数名称已更改 - 它们现在包含程序包名称。

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

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