J2ObjC로 Java와 Swift를 협업
목표
Android와 iOS에서 무료 도구로 모델 부분의 코드를 유니버설하고 싶습니다.
안드로이드와 iOS에서 코드를 유니버설화하려는 요구가 자주 있습니다.게임용과 HTML5+JavaScript 사용 외에는
하지만 어느 것이든 유상이다.무료 사용이 거의 없고 실용적인 수준에 도달한 J2ObjC는 구글에서도 인박스 개발에 사용된 실적이 있어 유력한 후보일다.
일단 해볼게요.
환경
응용 프로그램의 자바 부분 static library화
원인
J2ObjC 홈페이지의 설명이에 따라 Swift 프로젝트에 Java 파일이 공존하면 Objective-C로 변환하기 전에 Swift 파일이 컴파일되기 시작하여 헤더 파일을 찾을 수 없어 실패합니다.Java 파일을 변경한 후 구축할 때 변환이 실행되지 않는 문제도 발생했습니다.이것들은 Objective-C 프로젝트에서는 발생하지 않을 것 같습니다.
Java 섹션을 다른 대상으로 라이브러리화하십시오.다만 이것도dynamic 프레임워크화하면 순조롭지 않다.여기에 따르면 J2ObjC 자체는dynamic 프레임워크화가 필요한 것 같다.static library는 비교적 간단합니다. 제가 그 방법을 소개하겠습니다.
다른 대상 만들기
우선 static library의 목표를 추가합니다.
이번에 우리는 모델이라는 목표를 선택했다.새 모델 폴더를 만들어서 모델 대상의 원본 파일을 배치할 수 있기 때문에 여기에 자바 파일을 설치하기로 했습니다.Java 규칙에 따라 이름공간과 동일한 폴더 계층으로 설정합니다.
네임스페이스 및 접두사
Objective-C에는 이름 공간이 없기 때문에 클래스 이름에 접두사를 붙입니다.기본적으로 이름 공간을 낙타 상자로 바꾸는 것은 접두사입니다.예를 들어 app.model.Config 클래스의 경우 Objective-C가 AppModelConfig로 명명됩니다.
이것은 설정 파일을 준비해서 변경할 수 있다.여기는 모델/prefixes입니다.프로퍼티라는 이름으로 준비했습니다.
Model/prefixes.propertiesapp.model: AM
J2ObjC에 전송된 변환 명령을 통해 AMConfig의 클래스 이름으로 출력됩니다.빈 칸이라면 접두사가 없고 Config라는 클래스 이름입니다.응용 프로그램 내의 반이라면 접두사가 없어도 된다고 생각합니다.
그러나 출력 파일 이름에 접두사가 없습니다. 파일 이름이 충돌하지 않겠습니까?설명에서 헤더 파일이 층으로 나누어진 것 같지만 말한 설정에 따라 그렇지 않다.글쎄, 어플리케이션에서 사용하는 클래스는 개의치 않지만 외부 라이브러리를 변환하는 상황에서 이대로 가면 곤란할 것 같아요.
변환 설정
이제 모델 대상에 Java 파일을 Objective-C 파일로 변환하도록 설정합니다.참조J2ObjC의 Xcode Build Rules.
더하기 기호를 사용하여 구문 규칙에 규칙을 추가합니다.설정 결과는 다음과 같습니다.
스크립트 부분은 다음과 같습니다.${HOME}/Library/j2objc/j2objc -d ${DERIVED_FILES_DIR} \
--prefixes ${PROJECT_DIR}/Model/prefixes.properties \
--no-package-directories ${INPUT_FILE_PATH};
J2ObjC 홈페이지 설명에 -sourcepath 설정이 없어도 상관없습니다.또 방금 준비한 접두사 설정 파일을 지정했습니다.
이제 프로젝트에 추가된 Java 파일은 Objective-C로 변환되고 중간 파일로 출력됩니다.
이 글은 나중에 전체 설정을 ARC로 올바르지 않습니다. 여기 있습니다.m 파일의 Compiler Flags에서 "-fno-objc-arc"를 지정하면 변환 파일에만 ARC를 비활성화할 수 있습니다.
Objective-C 파일 사용 설정
사용자 제목 검색 경로를 설정합니다.변환된 헤더 파일을 참조하려면 $(DERIVED_FILES_DIR), J2ObjC의 헤더 파일을 참조하려면 $(HOME)/Library/j2objc/include를 지정합니다.
또한 CLANG_ENABLE_OBJC_ARC를 "아니오"로 설정하고 ARC삼를 비활성화합니다.J2ObjC 라이브러리와의 링크는 응용 프로그램 측면에서 이루어지기 때문에 모델 대상에서 필요하지 않습니다.
응용 프로그램 측면에서 중간 헤더 파일 공개
응용 프로그램에서 생성된 라이브러리를 사용하려면 변환된 Objective-C의 헤더 파일이 필요합니다.응용 프로그램 한쪽에서 이것을 볼 수 있다.
모델 대상의 Build Phases에서 + 버튼을 눌러 새 Run Script Phase를 추가합니다.
스크립트는 다음과 같습니다.
cp ${DERIVED_FILES_DIR}/*.h ${BUILT_PRODUCTS_DIR}/include/
응용 프로그램 측면에서 사용하기 편리하도록 공개된 헤더 파일은 모델/모델로 요약됩니다.h#import를 사용하세요.
응용 프로그램 측 설정
Model 라이브러리를 응용 프로그램에 링크하도록 구성합니다.응용 프로그램 대상General을 선택하고 Linked Frameworks and Libraries에서 플러스 단추로libModel을 진행합니다.a를 추가하십시오.
그리고 리비큐코어.tbd도 추가합니다.웹 페이지 정보에 따르면 Java 측이 사용하는 라이브러리에 따라 추가 내용이 필요할 것 같습니다.
구축 설정에서
app.model: AM
${HOME}/Library/j2objc/j2objc -d ${DERIVED_FILES_DIR} \
--prefixes ${PROJECT_DIR}/Model/prefixes.properties \
--no-package-directories ${INPUT_FILE_PATH};
cp ${DERIVED_FILES_DIR}/*.h ${BUILT_PRODUCTS_DIR}/include/
시험적으로 사용하다
Java 파일 추가
app.model.Config.자바를 만듭니다.$ mkdir -p Model/app/model
$ vi Model/app/model/Config.java
Model/app/model/Config.javapackage app.model;
class Config {
private static final int DEFAULT_SPEED = 20;
private int _speed;
Config() {
reset();
}
public void reset() {
_speed = DEFAULT_SPEED;
}
public int getSpeed() {
return _speed;
}
public void setSpeed(int speed) {
_speed = speed;
}
}
프로젝트의 모델 대상사에 추가합니다.
헤더 파일 요약 및 공개
대상을 생성할 때 자동으로 생성되는 모델/모델입니다.m가 필요하지 않으니 삭제하세요.한편 모델.h에서 외부에 공개할 헤더 파일#import입니다.클래스 설명을 삭제하십시오.
Model/Model.h#import "Config.h"
공개할 헤더 파일을 여기에 추가합니다.이렇게 하면 응용 프로그램 측면에서 볼 때 모델이다.#importh만 있으면 사용할 수 있습니다.
응용 프로그램에서 사용하기
ViewController에서 Config를 생성하고 getSpeed() 결과를 로그로 내보내려고 합니다.
ViewController.swiftimport UIKit
class ViewController: UIViewController {
private let config = Config()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
print(String(config.getSpeed()))
}
}
실행되면 Xcode의 로그 출력에 "20"이 표시됩니다.
변환된 파일을 보는 방법
Objective-C에서 Java 단자를 변환하는 방법을 보려고 할 수도 있습니다.파일을 DERIVED로 변환_FILES_DIR로 출력되지만 이것이 어디를 가리키는지 조사하기 위해 다음 명령을 사용할 수 있습니다.프로젝트 루트에서 실행하십시오.$ xcodebuild -showBuildSettings -target Model | grep DERIVED_FILES_DIR
이제 Model 타겟의 DERIVED_FILES_DIR을 내보냅니다.구축할 때의 방안에 따라 Release-iphoneos의 부분을 Debug-iphoneimulator 등으로 교체해 주십시오.
여기는 비상금입니다.
전환이 느려요!
그리고 이 구조라면 Debug 빌딩, Release 빌딩, 실기, 시뮬레이터를 전환할 때마다 새로운 변환이 이루어진다.Java에서 Objective-C로의 변환은 모두 한 번 하면 되지만 중간 파일의 출력 목적지가 다르기 때문입니다.
중간 파일의 출력 목표를 유니버설화할 수 있는지 생각 중입니다오.
기존 Java 라이브러리 사용
참조J2ObjC를 사용하여 RxJava를 iOS 라이브러리로 변환.
실용적이지만 아직β버전 처리입니다.Java를 사용하려면 기업에서 1년에 199달러에 사용할 수 있는 RoboVM을 추천합니다. ↩
libicucore.링크 Binary With Libraries에 tbd를 추가해야 합니다. ↩
변환할 때 ARC에서 사용하는 코드를 생성할 수도 있지만 J2ObjC 팀에서 추천한 ARC가 잘못되었습니다.ARC는 인간을 위한 것이기 때문에 기계적인 전환이라면 필요 없다. 왜냐하면 ARC의 무효한 성능이 더 높기 때문이다.성능 차이는 Mobile App Performance 를 참조하십시오. ↩
이 방법이 아니라 모두 Xcode에서 만들 수 있습니다. ↩
그걸 생각하기 전에 결과적으로 RoboVM을 사용해야 할 것 같아요. ↩
Reference
이 문제에 관하여(J2ObjC로 Java와 Swift를 협업), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/k5n/items/270eb3ee4c62abfa6408
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
$ mkdir -p Model/app/model
$ vi Model/app/model/Config.java
package app.model;
class Config {
private static final int DEFAULT_SPEED = 20;
private int _speed;
Config() {
reset();
}
public void reset() {
_speed = DEFAULT_SPEED;
}
public int getSpeed() {
return _speed;
}
public void setSpeed(int speed) {
_speed = speed;
}
}
#import "Config.h"
import UIKit
class ViewController: UIViewController {
private let config = Config()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
print(String(config.getSpeed()))
}
}
Objective-C에서 Java 단자를 변환하는 방법을 보려고 할 수도 있습니다.파일을 DERIVED로 변환_FILES_DIR로 출력되지만 이것이 어디를 가리키는지 조사하기 위해 다음 명령을 사용할 수 있습니다.프로젝트 루트에서 실행하십시오.
$ xcodebuild -showBuildSettings -target Model | grep DERIVED_FILES_DIR
이제 Model 타겟의 DERIVED_FILES_DIR을 내보냅니다.구축할 때의 방안에 따라 Release-iphoneos의 부분을 Debug-iphoneimulator 등으로 교체해 주십시오.여기는 비상금입니다.
전환이 느려요!
그리고 이 구조라면 Debug 빌딩, Release 빌딩, 실기, 시뮬레이터를 전환할 때마다 새로운 변환이 이루어진다.Java에서 Objective-C로의 변환은 모두 한 번 하면 되지만 중간 파일의 출력 목적지가 다르기 때문입니다.
중간 파일의 출력 목표를 유니버설화할 수 있는지 생각 중입니다오.
기존 Java 라이브러리 사용
참조J2ObjC를 사용하여 RxJava를 iOS 라이브러리로 변환.
실용적이지만 아직β버전 처리입니다.Java를 사용하려면 기업에서 1년에 199달러에 사용할 수 있는 RoboVM을 추천합니다. ↩
libicucore.링크 Binary With Libraries에 tbd를 추가해야 합니다. ↩
변환할 때 ARC에서 사용하는 코드를 생성할 수도 있지만 J2ObjC 팀에서 추천한 ARC가 잘못되었습니다.ARC는 인간을 위한 것이기 때문에 기계적인 전환이라면 필요 없다. 왜냐하면 ARC의 무효한 성능이 더 높기 때문이다.성능 차이는 Mobile App Performance 를 참조하십시오. ↩
이 방법이 아니라 모두 Xcode에서 만들 수 있습니다. ↩
그걸 생각하기 전에 결과적으로 RoboVM을 사용해야 할 것 같아요. ↩
Reference
이 문제에 관하여(J2ObjC로 Java와 Swift를 협업), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/k5n/items/270eb3ee4c62abfa6408
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
참조J2ObjC를 사용하여 RxJava를 iOS 라이브러리로 변환.
실용적이지만 아직β버전 처리입니다.Java를 사용하려면 기업에서 1년에 199달러에 사용할 수 있는 RoboVM을 추천합니다. ↩
libicucore.링크 Binary With Libraries에 tbd를 추가해야 합니다. ↩
변환할 때 ARC에서 사용하는 코드를 생성할 수도 있지만 J2ObjC 팀에서 추천한 ARC가 잘못되었습니다.ARC는 인간을 위한 것이기 때문에 기계적인 전환이라면 필요 없다. 왜냐하면 ARC의 무효한 성능이 더 높기 때문이다.성능 차이는 Mobile App Performance 를 참조하십시오. ↩
이 방법이 아니라 모두 Xcode에서 만들 수 있습니다. ↩
그걸 생각하기 전에 결과적으로 RoboVM을 사용해야 할 것 같아요. ↩
Reference
이 문제에 관하여(J2ObjC로 Java와 Swift를 협업), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/k5n/items/270eb3ee4c62abfa6408텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)