直到现在我在Windows中成功使用带有JNA的dll文件。我已成功在VC ++中创建了dll,然后使用JNA在Java中加载。 但是现在我还需要在Mac OS中提供相同的软件。
因为我没有使用过mac os和Xcode,所以我不知道如何创建.dylib。
以下是我目前使用Google和其他资源尝试的内容。
1)打开Xcode,选择“创建一个新的Xcode项目”
2)选定框架&库,并单击了C / C ++库
3)我将项目名称作为SimpleDylib,并选择Type为Dynamic并按下。
4)然后我在这个项目中添加了一个新文件,一个C ++文件,名称为SimpleDylib.cpp
5)我写了一个简单的函数
int addNumber(int a,int b)
{
return a+b;
}
从这里我不知道如何导出这个功能。就像在Windows VC ++中一样,我使用.def文件成功导出函数。在使用jna的java中,我能够成功地在dll中使用这个dll和函数。
在Xcode中我尝试使用 #define EXPORT _attribute__((visibility("default")))
EXPORT
int addNumber(int a,int b)
{
return a+b;
}
但我仍然无法在Java中使用这个dylib而且我得到错误
线程“main”中的异常java.lang.UnsatisfiedLinkeError:错误lloking up函数'addNumber':dlsym(0x7fb930d49930,addNumber):找不到符号
那么如何从dylib导出函数?到目前为止我的上述步骤是否正确?什么是创建.dylib的方法,可以在JNA-JAVA中加载和使用。
答案 0 :(得分:1)
如果您的文件是.cpp
文件,那么您无疑会遭遇C++
名称错误。
您需要将extern "C"
添加到导出中,例如:
extern "C" EXPORT int addNumber(int a,int b)
要验证例程是否被破坏,您可以使用nm查看.dylib,例程的错误版本如下:__Z9addNumberii
而未编译的版本看起来像_addNumber
此外,在OSX上,与JNI / JNA一起使用的共享库的首选扩展名为.jnilib
,而不是.dylib
,但它们除了文件扩展名外都是相同的