UnsatisfiedLinkError на iOS, но не на Android, loadLibrary всегда завершается успешно

У меня есть некоторый код 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

Снимок Java-кода в com / test / Native.java:

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

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

И код C ++, который компилируется в libtest.dylib:

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 выход выше, который показывает, что они есть.

4

Решение

Решение было передо мной, как обычно, в этой строке:

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

Сборка для iOS, архитектура должна быть armv7 +. Неверно сконфигурированный подпроект xcode.

0

Другие решения


По вопросам рекламы [email protected]