일부 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}
답장을 보내 주시면 감사하겠습니다. 감사합니다.
그러나 객관적인 c 속성을 사용하지 않도록 변환해야합니다. 그래서 Mark는 말하기와 같이 Pre leopard를 지원하기 위해 Objective C 1.0 기능을 사용합니다. 또한, Xcode에서 JNI 템플릿을 사용하는 것에 대해 이야기하고 있습니까? JNI 템플릿을 사용해 보았지만 javah를 사용하고 싶지 않았기 때문에 다소 번거롭고 프로젝트/설정을 사용자 정의하는 방법을 알 수 없었습니다. 필자는 오픈 소스 프로젝트에서 Mac JNI의 몇 가지 예를 발견 할 수 있었고, 필자가 만든 make 또는 셸 스크립트를 사용하여 끝내 었습니다. 나는 여전히 코드를 XCode에 쓴다. – Cal
"하지만 여전히 객관적인 c 속성을 사용하지 않도록 변환해야합니다. 따라서 Mark는 말하기와 같이 Pre leopard를 지원하기 위해 Objective C 1.0 기능을 사용합니다. Tiger에서 Objective-C 2.0의 어떤 것도 사용할 수 없습니다. –
"아직 Xcode에 코드를 씁니다."Xcode를 텍스트 편집기로만 사용한다고해서 빌드 시스템의 편리함을 얻을 수는 없습니다. –