필수 링크 설정

링크 빌드 단계 (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.channelsjava.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.netjavax.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.netjavax.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.zipjava.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 플래그는 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
  };