MAC OSX-编写Xcode .Dylib以在JNA(Java Native Access)-JAVA中使用

时间:2014-08-19 15:23:36

标签: java xcode macos jna dylib

直到现在我在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中加载和使用。

1 个答案:

答案 0 :(得分:1)

如果您的文件是.cpp文件,那么您无疑会遭遇C++名称错误。

您需要将extern "C"添加到导出中,例如:

extern "C" EXPORT int addNumber(int a,int b)

要验证例程是否被破坏,您可以使用nm查看.dylib,例程的错误版本如下:__Z9addNumberii而未编译的版本看起来像_addNumber

此外,在OSX上,与JNI / JNA一起使用的共享库的首选扩展名为.jnilib,而不是.dylib,但它们除了文件扩展名外都是相同的