我遇到了一些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“东西”。在10.4.11上工作的另一个jnilib只使用1 .m文件而不使用目标c属性(它使用NSMutableArray,NSDictionary,CFPreferences等)。在10.4.11上不起作用的那个更复杂,使用了我写的一些客观的c类。
也许我没有正确编译我的代码或者可能不支持属性?
我有一个编译jnilib的shell脚本。它实际上和我能说的那个一样。我有另一个部分用于在脚本中编译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}
感谢您对如何调试此问题的答案和想法。 谢谢!
答案 0 :(得分:1)
使用Xcode。它支持Java,它旨在处理支持旧版Mac OS X之类的东西。在Xcode中,您可以将SDKROOT
设置为macosx10.4u(Mac OS X,10.4,具有通用二进制支持)和{{1到10.4,Xcode将告诉链接器在哪里获得正确版本的框架。
如果您坚持使用shell脚本构建,那么您需要自己完成。您目前正在使用系统版本。
答案 1 :(得分:1)
属性是一个新的Objective-C 2特性Apple site,只能在OSX 10.5及更高版本上运行。因此我怀疑C代码只能在10.5
上运行您必须编写针对旧版OSX的C代码。有关详细信息,请参阅Apple docs这包括非Xcode方式