java - iOS 上的 UnsatisfiedLinkError 而不是 Android,loadLibrary 总是成功

标签 java c++ libgdx java-native-interface

我有一些 Java 和 C++ 代码,我可以在这两个平台上编译它们并构建 native 库。我可以验证这些库是否包含我期望的功能,并且 Java 能够在 Android 和 iOS 上加载这些库。在 Android 上一切顺利,没有崩溃,但在 iOS 上我遇到了一个非常令人沮丧的错误:

2015-05-11 11:34:48.418 IOSLauncher[52454:851038] [info] test: initializing native libraries...
2015-05-11 11:34:48.418 IOSLauncher[52454:851038] [info] test: library path set to:       "/Users/test/Library/Developer/CoreSimulator/Devices/A189459D-B2D5-4E78-A6E4-A7EAD19DA017/data/Containers/Bundle/Application/DF265D55-DA3C-4C10-851D-20591C4C8C06/IOSLauncher.app"
2015-05-11 11:34:48.419 IOSLauncher[52454:851038] [info] test: loading native libraries on x86_64...
2015-05-11 11:34:48.419 IOSLauncher[52454:851038] [info] test:  test
2015-05-11 11:34:48.424 IOSLauncher[52454:851038] [info] test: loaded libraries successfully

java.lang.UnsatisfiedLinkError: com/test/Native.getPointer()J
    at com.test.Native.getPointer(Native Method)
    at com.test.WavApp.initNativeEngine(WavApp.java)
    at com.test.WavApp.create(WavApp.java)
    at com.badlogic.gdx.backends.iosrobovm.IOSGraphics.draw(IOSGraphics.java)
    at com.badlogic.gdx.backends.iosrobovm.IOSGraphics$1.draw(IOSGraphics.java)
    at com.badlogic.gdx.backends.iosrobovm.IOSGraphics$1.$cb$drawRect$(IOSGraphics.java)
    at org.robovm.apple.uikit.UIApplication.main(Native Method)
    at org.robovm.apple.uikit.UIApplication.main(UIApplication.java)
    at com.test.IOSLauncher.main(IOSLauncher.java)


BUILD SUCCESSFUL

Total time: 18.262 secs

com/test/Native.java 中 java 代码的快照:

static 
{
      System.loadLibrary("test");
      Log.i("loaded libraries successfully");
}

public static native long getPointer();
public static native void freePointer(long enginePointer);

以及编译成libtest.dylib的C++代码:

extern "C"
{
    JNIEXPORT jlong JNICALL Java_com_test_Native_getPointer(JNIEnv* env, jobject thiz)
    {
        return (jlong)(new PointerTest());
    }

    JNIEXPORT void JNICALL Java_com_test_Native_freePointer(JNIEnv* env, jobject thiz,
        jlong enginePtr)
    {
        if ((PointerTest*)enginePtr)
            delete (PointerTest*)enginePtr;
    }
}

关于构建的共享库的更多信息:

Release$ file libtest.dylib
libtest.dylib: Mach-O 64-bit dynamically linked shared library x86_64

并验证导出:

$ nm -g libtest.dylib | grep Native
0000000000011ce0 T _Java_com_test_Native_freePointer
0000000000011c40 T _Java_com_test_Native_getPointer

有什么想法吗?这让我发疯了几个小时。我可以通过简单地使用不同的库并搜索该函数来在我的 Android 设备上重现此错误。我猜 xcode 以某种方式隐藏或剥离了符号,但这似乎与我上面显示它们在那里的 nm 输出无关。

最佳答案

像往常一样,解决方案就在我面前:

libtest.dylib: Mach-O 64-bit dynamically linked shared library x86_64

为iOS构建,架构应该是armv7+。 xcode 子项目配置错误。

关于java - iOS 上的 UnsatisfiedLinkError 而不是 Android,loadLibrary 总是成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30174337/

相关文章:

java - 演示模型和多个数据源

c++ - 使用脉冲编码调制将数据从一台电脑传输到另一台电脑

java - 从android中的另一个类加载纹理

java - libGDX 设置旋转点 3D

android - ilbgdx JSON 将数组保存到首选项中

java - JSP Spring-MVC 重用 Controller 逻辑

java - "Too few parameters"错误,即使我输入兼容的数据类型

c++ - 返回声明中的构造

java - 如何检查移动数据连接并为其设置事件?

c++ - 无法转换为类型的函数指针