2009-10-03 97 views
0

我對某些JNI代碼有問題。 我得到在從OS X 10.4.11(PPC)機打印到控制檯下面的錯誤(正常工作在OS X 10.5以上的較新版本)Mac OS X 10.4.11上的JNI錯誤... dyld:找不到符號:_objc_setProperty

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} 

我很感激你的答案和想法如何調試這一個。 謝謝!

回答

1

屬性是一個新的Objective-C 2功能Apple site並且只能在OSX 10.5及更高版本上運行。因此,我懷疑C代碼只能運行在10.5

您將不得不編寫針對舊版OSX的C代碼。詳情請參閱Apple docs這包括非Xcode的方式

1

使用Xcode。它支持Java,並且它被設計用於處理諸如支持舊版Mac OS X的事情。在Xcode中,您可以將SDKROOT設置爲macosx10.4u(帶有通用二進制支持的Mac OS X 10.4),並將MACOSX_DEPLOYMENT_TARGET設置爲10.4,並且Xcode將告訴鏈接器在哪裏得到正確的框架版本。

如果你堅持用shell腳本構建,那麼你需要自己做。您目前正在使用系統版本。

+0

但我仍然必須轉換爲不使用目標c屬性嗎?那麼,它只是使用Objective C 1.0的功能來支持前期的豹子,就像馬克所說的那樣?另外,你是否在談論使用XCode中的JNI模板?我嘗試使用JNI模板,但是我發現它有點麻煩,因爲我並不真正需要/想要使用javah,我無法弄清楚如何自定義項目/設置。我在開源項目中找到了一些Mac JNI的例子,我看到的例子使用make或shell腳本,這就是我最終做的。我仍然在XCode中編寫代碼。 – Cal 2009-10-03 17:32:05

+0

「但我仍然必須轉換爲不使用客觀的c屬性嗎?那麼,它只是使用Objective C 1.0的特徵來支持前期豹的支持,就像馬克所說的那樣?「對;你不能在Tiger上使用Objective-C 2.0中的任何東西。 – 2009-10-03 20:33:07

+0

「我仍然在XCode中編寫代碼」。僅將Xcode用作文本編輯器並不能爲您構建系統帶來便利。 – 2009-10-03 20:34:40

相關問題