2009-10-03 4 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이 프로그램에서이 코드보다 먼저 실행됩니다. 이 오류는 핵심 목표 인 "물건"이 누락되었다고 말하는 것 같습니다. 10.4.11에서 작업하는 다른 jnilib은 단지 1 .m 파일을 사용하며 객관적인 c 속성 (NSMutableArray, NSDictionary, CFPreferences 등을 사용)을 사용하지 않습니다. 10.4.11에서 작동하지 않는 것은 좀 더 복잡합니다. 필자가 작성한 적절한 특성을 가진 객관적인 클래스를 사용합니다.

아마도 내 코드를 올바르게 컴파일하지 않았거나 속성이 지원되지 않을 수 있습니까?

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} 

답장을 보내 주시면 감사하겠습니다. 감사합니다.

답변

1

속성은 새로운 Objective-C 2 기능 Apple site이며 OSX 10.5 이상에서만 실행됩니다. 따라서 C 코드가 10.5에서만 실행될 것으로 의심됩니다.

OSX의 이전 버전을 대상으로 C 코드를 작성해야합니다. 자세한 내용은 Apple docs을 참조하십시오. 여기에는 비 Xcode 방식이 포함됩니다.

1

Xcode를 사용하십시오. Xcode에서는 SDKROOT을 macosx10.4u (Mac OS X, 유니버설 바이너리 지원이있는 10.4)로 설정하고 MACOSX_DEPLOYMENT_TARGET을 10.4로 설정하고 Xcode는 10.4로 설정합니다. Xcode에서는 이전 버전의 Mac OS X을 지원하도록 설계되었습니다. 링커에게 올바른 버전의 프레임 워크를 가져올 곳을 알려줍니다.

쉘 스크립트를 사용하여 건물을 고집하는 경우 직접해야합니다. 현재 시스템 버전을 사용 중입니다.

+0

그러나 객관적인 c 속성을 사용하지 않도록 변환해야합니다. 그래서 Mark는 말하기와 같이 Pre leopard를 지원하기 위해 Objective C 1.0 기능을 사용합니다. 또한, Xcode에서 JNI 템플릿을 사용하는 것에 대해 이야기하고 있습니까? JNI 템플릿을 사용해 보았지만 javah를 사용하고 싶지 않았기 때문에 다소 번거롭고 프로젝트/설정을 사용자 정의하는 방법을 알 수 없었습니다. 필자는 오픈 소스 프로젝트에서 Mac JNI의 몇 가지 예를 발견 할 수 있었고, 필자가 만든 make 또는 셸 스크립트를 사용하여 끝내 었습니다. 나는 여전히 코드를 XCode에 쓴다. – Cal

+0

"하지만 여전히 객관적인 c 속성을 사용하지 않도록 변환해야합니다. 따라서 Mark는 말하기와 같이 Pre leopard를 지원하기 위해 Objective C 1.0 기능을 사용합니다. Tiger에서 Objective-C 2.0의 어떤 것도 사용할 수 없습니다. –

+0

"아직 Xcode에 코드를 씁니다."Xcode를 텍스트 편집기로만 사용한다고해서 빌드 시스템의 편리함을 얻을 수는 없습니다. –