java - MAC OSX-Write Xcode .Dylib 用于 JNA (Java Native Access) -JAVA

标签 java xcode macos jna dylib

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

因为我没有使用过 mac os 和 Xcode,所以我不知道如何创建 .dylib。

这是我迄今为止使用 Google 和其他资源尝试过的内容。

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

2)选择Framework & library,点击C/C++ Library

3) 我将项目名称命名为 SimpleDylib,将类型选择为 Dynamic,然后按下一步。

4) 然后我向这个项目添加了一个新文件,一个 C++ 文件,并命名为 SimpleDylib.cpp

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

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

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

我尝试在 Xcode 中使用

#define EXPORT _attribute__((visibility("default"))) 导出 int addNumber(int a,int b) { 返回 a+b; }

但我仍然无法在 Java 中使用此 dylib,并且出现错误

Exception in thread "main" java.lang.UnsatisfiedLinkeError: Error lloking up function 'addNumber' : dlsym(0x7fb930d49930,addNumber) : symbol not found

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

最佳答案

如果您的文件是 .cpp文件那么你无疑正在遭受 C++名称修改。

您需要添加 extern "C"像这样导出:

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

要验证例程是否损坏,您可以使用 nm 查看 .dylib,例程的损坏版本如下所示:__Z9addNumberii而未损坏的版本看起来像 _addNumber .

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

关于java - MAC OSX-Write Xcode .Dylib 用于 JNA (Java Native Access) -JAVA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25387238/

相关文章:

java - 尝试登录失败后,Shiro 不会重定向到 loginUrl

java - 在 Java Pane 中格式化输出

iphone - 从核心数据查询 NSDate 对象

objective-c - 自 OSX 10.8 起屏幕保护程序崩溃

java - Sikuli 错误 - 到目前为止没有可用的有效库路径

java - 复杂的字符串匹配

ios - 当我在 Xcode 中设置 "Horizontal centre in container"时,为什么框架会跳到 View 的顶部?

xcode - 将现有应用程序提交到 iTunes Connect 时出现问题

objective-c - Mac OS X 应用程序的最小窗口大小

macos - 日历中的 Google 环聊链接