MacOSX写入Xcode.Dylib以在JNA(Java本机访问)-Java中使用

MacOSX写入Xcode.Dylib以在JNA(Java本机访问)-Java中使用,java,xcode,macos,jna,dylib,Java,Xcode,Macos,Jna,Dylib,到目前为止,我在windows中成功地使用了带有JNA的dll文件。我已经在VC++中成功创建了dll,然后使用JNA将其加载到Java中。 但现在我有一个需求,我需要在Mac Os中提供同样的软件 由于我没有使用MacOS和Xcode,我不知道如何创建.dylib 以下是我迄今为止使用谷歌和其他资源所做的尝试 1) 打开Xcode,选择“创建新的Xcode项目” 2) 选择框架和库,然后单击C/C++库 3) 我将项目名称命名为SimpleDylib,并将类型选择为Dynamic,然后按nex

到目前为止,我在windows中成功地使用了带有JNA的dll文件。我已经在VC++中成功创建了dll,然后使用JNA将其加载到Java中。 但现在我有一个需求,我需要在Mac Os中提供同样的软件

由于我没有使用MacOS和Xcode,我不知道如何创建.dylib

以下是我迄今为止使用谷歌和其他资源所做的尝试

1) 打开Xcode,选择“创建新的Xcode项目”

2) 选择框架和库,然后单击C/C++库

3) 我将项目名称命名为SimpleDylib,并将类型选择为Dynamic,然后按next

4)然后,我添加了新文件,一个C++文件到这个项目中,并把名字命名为SimuldyLy.CPP

5) 我写了一个简单的函数

int addNumber(int a,int b)
{ 
返回a+b;
}

从这里我不知道如何导出这个函数。就像在windows VC++中一样,我使用.def文件成功导出函数。在使用jna的java中,我能够成功地使用这个dll和dll中的函数

在Xcode中,我尝试使用

#定义导出(可见性(“默认”))
出口
内部地址编号(内部地址a、内部地址b)
{ 
返回a+b;
}

但我仍然不能在Java中使用这个动态库,我得到的错误如下

线程“main”java.lang.UnsatisfiedLinkeError中出现异常:分配函数“addNumber”时出错:dlsym(0x7fb930d49930,addNumber):未找到符号


那么如何从dylib导出函数呢?到目前为止,我的上述步骤是否正确?创建可在JNA-JAVA中加载和使用的.dylib的方法是什么。

如果您的文件是
.cpp
文件,那么您无疑会受到
C++
名称混乱的困扰

您需要向导出添加
extern“C”
,如:

extern "C" EXPORT int addNumber(int a,int b)
要验证例程是否损坏,可以使用nm查看.dylib,损坏的例程版本看起来像:
\uuuuz9addnumberii
,而未混合的版本看起来像
\uaddnumber


此外,在OSX上,与JNI/JNA一起使用的共享库的首选扩展名是
.jnilib
,而不是
.dylib
,但它们除了文件扩展名之外都是相同的如果您查看JNA本身的构建,它会为JNA运行的所有平台(包括OSX)生成一个名为“testlib”的共享库除了JNA之外,您还可以尝试一下:我们可以让它编译C++文件并适当地构建库文件。