링크 빌드 단계 (Xcode의 '바이너리를 라이브러리와 연결' 빌드 단계)에는 J2ObjC 관련 플래그가 필요합니다. 이 플래그는 애플리케이션에서 변환된 자바 클래스를 사용하는 방식에 따라 달라집니다. 핵심 플래그는 j2objcc 명령줄 스크립트에 의해 설정되지만 Xcode로 빌드할 때 지정해야 합니다.
SDK 라이브러리
이 라이브러리는 J2ObjC의 JRE 구현에 필수입니다. 이 라이브러리를 포함하지 못하면 이름이 _iconv
로 시작하는 정의되지 않은 기호 오류가 발생합니다.
보관함 | 링크 플래그 | 설명 |
---|---|---|
iconv | -l 아이콘v | jre_core에서 문자 인코딩 및 디코딩에 사용됩니다. |
이러한 라이브러리는 J2ObjC의 JRE 구현에서 사용되며 앱에 연결해야 할 수 있습니다.
보관함 | 링크 플래그 | 설명 |
---|---|---|
zip | -l z | java.util.zip에서 사용됩니다. jre_zip을 연결하는 경우 이 코드를 포함해야 합니다. |
보안 | -framework 보안 | jre_security를 연결할 경우 필요합니다. |
도서관 검색 경로
J2ObjC의 배포에는 여러 정적 라이브러리가 포함되어 있습니다. 이러한 라이브러리를 사용하려면 프로젝트에서 이러한 라이브러리를 찾을 위치를 링커에 알려야 합니다.
일반적으로 라이브러리 검색 경로에는 _$(j2objcdistribution)/lib가 포함되어야 하며, 여기서 _$(j2objcdistribution) 변수는 J2ObjC의 로컬 복사본에 대한 경로입니다. 예를 들어 J2ObjC 출시 보관 파일을 '/usr/local/'에 압축 해제한 경우 이 경로는 '/usr/local/j2objc'가 됩니다.
중요: 프로젝트에 실제로 _$(j2objcdistribution)을 사용하지 마세요. 항상 J2ObjC를 설치한 실제 경로를 지정하세요.
소스 코드 사본에서 J2ObjC를 빌드하는 경우 _$(j2objcdistribution)은 복사본의 'j2objc/dist/' 디렉터리입니다. 이 디렉터리는 make dist
를 사용하여 J2ObjC를 빌드할 때까지 존재하지 않습니다.
Xcode: 라이브러리 검색 경로
_$(j2objcdistribution)/lib를 추가하여 앱 타겟의 라이브러리 검색 경로를 업데이트합니다 (다시 실제 경로 사용).
JRE 라이브러리
이러한 라이브러리는 J2ObjC의 JRE 에뮬레이션에 의해 정의된 클래스를 구현합니다.
참고: libjre_core.a
라이브러리에는 대부분의 다른 하위 집합 라이브러리의 클래스가 포함되어 있습니다. 앱 크기를 줄이기 위해 권장되는 방법은 앱과 -l jre_core
연결을 시작한 다음 누락된 기호를 확인하는 하위 집합 라이브러리를 추가하는 것입니다.
예를 들어 가장 일반적으로 사용되는 java.io
클래스는 libjre_core.a
에 있으므로 이름이 JavaIo
로 시작하는 해결되지 않은 기호 오류가 있는 경우에만 libjre_io.a
라이브러리를 포함합니다.
보관함 | 링크 플래그 | 설명 |
---|---|---|
libjre_core.a | -l jre_core | 생성된 모든 소스 파일에서 참조하는 J2ObjC의 JRE 에뮬레이션에 필요한 최소 클래스 집합. 변환된 자바 소스가 네트워킹, XML, SQL 등에 대해 JRE 지원을 참조하는 경우 추가 라이브러리 (아래)도 연결해야 합니다. |
libjre_beans.a | -l jre_beans |
java.beans 패키지의
모든 클래스 Swing 및 AWT 앱에서만 사용되기 때문에 모든 자바 Bean 클래스가 포함되지는 않습니다.
|
libjre_channels.a | -l jre_channels |
java.nio.channels 및 java.nio.channels.spi 패키지의
여러 클래스
|
libjre_concurrent.a | -l jre_concurrent |
java.util.concurrent , java.util.concurrent.atomic , java.util.concurrent.locks 패키지의
여러 클래스.
|
libjre_icu.a | -l jre_icu |
시간대를 지원하는 android.icu 의
여러 클래스 (주로 java.time 사용 설정)
|
libjre_io.a | -l jre_io |
java.io 패키지의
여러 클래스 (자주 사용되지 않음).
|
libjre_net.a | -l jre_net |
java.net 패키지의
여러 클래스. 하지만 java.net.URLClassLoader 클래스는 jre_security 에 있고 javax.net 및 javax.net.ssl 클래스는 jre_ssl 에 있습니다.
|
libjre_security.a | -l jre_security |
java.security 패키지의
대부분의 클래스 (일부 클래스는 jre_core 에 있음) 및 java.security.* , javax.crypto.* , javax.security.* 패키지의 클래스.
이 링크를 연결하는 경우 iOS 보안 프레임워크도 연결해야 합니다.
(SDK 라이브러리 참고)
|
libjre_sql.a | -l jre_sql |
java.sql 패키지의
모든 클래스
|
libjre_ssl.a | -l jre_ssl |
javax.net 및 javax.net.ssl 패키지의
모든 클래스
|
libjre_time.a | -l jre_time |
java.time 패키지의
모든 클래스
|
libjre_util.a | -l jre_util |
java.util 패키지의
여러 클래스와 java.util.logging 패키지. 그러나 대부분의 java.util 클래스는 jre_core 에 있으므로 해결되지 않은 JavaUtil* 기호 오류가 있는 경우에만(JavaUtilConcurrent* 기호는 jre_concurrent 라이브러리에 있음) 이 라이브러리를 포함합니다.
|
libjre_xml.a | -l jre_xml |
XML 관련 패키지의
모든 클래스(javax.xml.* , org.w3c.dom.* , org.xml.sax.* 포함)
|
libjre_zip.a | -l jre_zip |
java.util.zip 및 java.util.jar 패키지의
모든 클래스
이를 연결하는 경우 SDK ZIP 라이브러리도 연결해야 합니다. SDK 라이브러리를 참고하세요.
|
libjre_emul.a (-l jre_emul)
jre_emul
라이브러리에는 J2ObjC의 JRE 에뮬레이션에 포함된 모든 클래스가 포함되어 있습니다. 앱이 jre_emul
와 연결된 경우 다른 jre_* 라이브러리를 포함하지 않으면 링커가 중복 기호 오류를 보고합니다. 이는 jre_emul
가 이러한 다른 라이브러리에 정의된 모든 클래스를 포함하기 때문입니다.
기타 J2ObjC 라이브러리
다음 자바 라이브러리와 Android 유틸리티 클래스는 J2ObjC 배포에 정적 라이브러리로 포함됩니다.
보관함 | 링크 플래그 | 설명 |
---|---|---|
libguava.a | -l 구아바 | Guava: Java용 Google 핵심 라이브러리 |
libjavax_inject.a | -l javax_inject | JSR-330 종속 항목 삽입 주석 라이브러리 |
libjson.a | -l JSON | JSON 데이터 교환 라이브러리 이는 Android 버전의 JSON이며 다른 구현과 약간 다릅니다. |
libjsr305.a | -l jsr305 | 소프트웨어 결함 감지 라이브러리의 JSR-305 주석 |
libjunit.a | -l junit -ObjC | JUnit 테스트 프레임워크입니다. |
libmockito.a | -l 모키토 -ObjC | 자바 단위 테스트를 위한 Mockito 모의 프레임워크 |
libprotobuf_runtime.a | -l protobuf_runtime | J2ObjC 앱에 최적화된 Google 프로토콜 버퍼 런타임. J2ObjC protobuf를 사용하는 앱은 j2objc_protoc으로 proto 파일을 컴파일해야 합니다. |
libandroid_util.a | -l Android_utils | `android_util` 라이브러리에는 Android API 유틸리티 클래스의 작은 하위 집합이 포함되어 있습니다. 이는 Android 환경용 에뮬레이션을 제공하기 위한 것이 아니며, `android.util.Log`와 같은 유용한 클래스를 공유하는 방법일 뿐입니다. |
-ObjC 링크 플래그
-ObjC 플래그는 iOS 앱을 연결할 때 자주 사용되지만 Objective C 클래스와 카테고리를 정적 라이브러리에서 동적으로 로드해야 하는 경우에만 필요합니다. 이 플래그를 사용하면 실제로 사용 여부와 관계없이 연결된 모든 정적 라이브러리의 모든 클래스가 앱에 포함됩니다. 따라서 J2ObjC를 사용하는 앱은 런타임에 클래스가 로드되지 않는 경우 (한 가지 증상은 JavaLangClassNotFoundException
발생) -ObjC 플래그와 함께 연결하는 것이 좋습니다.
JUnit 및 Mockito 테스트 프레임워크는 리플렉션에 크게 의존하므로 이를 사용하는 테스트 앱은 -ObjC와 연결해야 합니다.
일부 클래스를 동적으로 로드할 수 있도록 전체 정적 라이브러리를 연결하는 대신 이러한 클래스를 정적으로 참조할 수 있습니다. 자바의 경우 정적 이니셜라이저 블록에서 이 작업을 실행할 수 있습니다. 다음은 J2ObjC의 IosSecurityProvider 클래스에 있는 예입니다.
// Reference all dynamically loaded classes, so they are linked into apps.
@SuppressWarnings("unused")
private static final Class<?>[] unused = {
IosCertificateFactory.class,
IosMD5MessageDigest.class,
IosRSAKeyFactory.class,
IosRSAKeyPairGenerator.class,
IosRSASignature.class,
IosSecureRandomImpl.class,
IosSHAMessageDigest.class
};