在iOS上出现了UnsatisfiedLinkError,但在Android上没有,loadLibrary总是成功的。

 2023-01-20    341  

问题描述

我有一些Java和C ++代码,可以在两个平台上编译并构建本机库.我可以验证库是否包含我期望的功能,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/test/andation.java中的Java代码的快照:

在iOS上出现了UnsatisfiedLinkError,但在Android上没有,loadLibrary总是成功的。

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输出无关,而我的nm表明它们在那里.

推荐答案

在这一行中,解决方案像往常一样在我面前:

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

为iOS构建,架构应为ARMV7+.配置错误的Xcode子标记.

以上所述是小编给大家介绍的在iOS上出现了UnsatisfiedLinkError,但在Android上没有,loadLibrary总是成功的。,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26085.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。