У меня есть некоторый код 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
выход выше, который показывает, что они есть.
Решение было передо мной, как обычно, в этой строке:
libtest.dylib: Mach-O 64-bit dynamically linked shared library x86_64
Сборка для iOS, архитектура должна быть armv7 +. Неверно сконфигурированный подпроект xcode.