Ошибка JNI в Mac OS X 10.4.11 ... dyld: символ не найден: _objc_setProperty - PullRequest
0 голосов
/ 03 октября 2009

У меня проблема с некоторым кодом JNI. Я получаю следующую ошибку, напечатанную в консоли с компьютера с OS X 10.4.11 (PPC) (она отлично работает на более новых версиях OS X 10.5 +)

dyld: lazy symbol binding failed: Symbol not found: _objc_setProperty
  Referenced from: /Path/to/my/lib/libMylib32.jnilib
  Expected in: /usr/lib/libobjc.A.dylib

dyld: Symbol not found: _objc_setProperty
  Referenced from: /Path/to/my/lib/libMylib32.jnilib
  Expected in: /usr/lib/libobjc.A.dylib

У меня есть другой jnilib, который отлично работает, и он работает до этого в программе. Кажется, ошибка говорит о том, что мне не хватает какой-то основной цели c "мелочи". Другой jnilib, который работает с 10.4.11, использует только 1 .m файл и не использует объективные свойства c (он использует NSMutableArray, NSDictionary, CFPreferences и так далее). Тот, который не работает в 10.4.11, является более сложным, использует некоторые объективные классы c с написанными мной свойствами.

Может быть, я неправильно компилирую свой код или свойства не поддерживаются?

У меня есть скрипт оболочки, который компилирует jnilib. Это практически то же самое, что работает, насколько я могу судить. У меня есть другой раздел для компиляции 64-битного jnilib выше этого в скрипте, но 32-битный используется для 10.4.11.

COCOA_HEADERS=/System/Library/Frameworks/Cocoa.framework/Headers
BITS=32
JAVA_HEADERS=/System/Library/Frameworks/JavaVM.framework/Versions/1.5/Headers
MAC_SDK=/Developer/SDKs/MacOSX10.4u.sdk
CFLAGS="-fPIC -arch i386 -arch ppc"
LIB_NAME=${LIB_PREFIX}${BITS}.jnilib
MAC_LIB_OUTPUT=/path/to/my/output/folder/${LIB_NAME}
DYLIB_ARCH="-arch i386 -arch ppc"

rm *.o
#Compile for 1.5 32bit Java
gcc -v -std=gnu99 -c ${CFLAGS} -isysroot ${MAC_SDK} -I${JAVA_HEADERS} -I${COCOA_HEADERS} ${SOURCE_FILES}
# Make the library file from the object files (*.o)
gcc -v -dynamiclib -o ${MAC_LIB_OUTPUT} *.o  -framework JavaVM -framework Cocoa ${DYLIB_ARCH}

Я ценю ваши ответы и идеи о том, как отладить этот. Спасибо!

Ответы [ 2 ]

1 голос
/ 03 октября 2009

Свойства - это новая функция Objective-C 2 Сайт Apple , которая работает только на OSX 10.5 и выше. Таким образом, я подозреваю, что код C будет работать только на 10,5

Вам придется написать код на C, предназначенный для более старых версий OSX. Подробнее см. Apple Docs Это включает в себя не Xcode способы

1 голос
/ 03 октября 2009

Использовать Xcode. Он поддерживает Java и предназначен для поддержки таких вещей, как поддержка старых версий Mac OS X. В Xcode вы должны установить для SDKROOT значение macosx10.4u (Mac OS X, 10.4 с универсальной двоичной поддержкой) и от MACOSX_DEPLOYMENT_TARGET до 10,4. и Xcode сообщит компоновщику, где взять правильные версии фреймворков.

Если вы настаиваете на сборке с помощью сценария оболочки, то вам нужно сделать это самостоятельно. В настоящее время вы используете системные версии.

...