一.下载:
https://github.com/google/j2objc/releases
如果下载的是source code,需要编译:
参考:https://developers.google.com/j2objc/guides/building-j2objc
*注意:路径上不要有空格,要不会报javac: invalid flag错误.
需要装maven
或者直接下载完整zip(推荐,更简单)
2.按照教程:
官方:https://developers.google.com/j2objc/guides/xcode-build-rules
中文:
- https://www.jianshu.com/p/f58ee097e773
简要来说就是添加:
-ljre_emul
J2OBJC_HOME
${J2OBJC_HOME}/frameworks
${J2OBJC_HOME}/lib ${J2OBJC_HOME}/include
发现还是会报错,官方的guide里面没有说要添加一下lib
在other linker flags:-liconv -lz
参考:https://www.jianshu.com/p/2cbe6c2806a4
添加build rules,例如:
if [ ! -f "${J2OBJC_HOME}/j2objc" ]; then echo "J2OBJC_HOME is not correctly defined, currently set to '${J2OBJC_HOME}'"; exit 1; fi;
"${J2OBJC_HOME}/j2objc" -d ${DERIVED_FILES_DIR} -sourcepath "${PROJECT_DIR}/your project" --no-package-directories -use-arc --prefix Java=J -g ${INPUT_FILE_PATH};
build一下转换
3.调用:
首先要注意类名,包和路径会变成类名
script里--prefix Othello.Engine(package name)=xxxx可以自定义类前缀
然后先#import "xxxx.h" (原Java类名),可能没有代码提示,需要import,才能调用,调用使用前缀+原java类名
一些错误解决:
Xcode 10 Error: Multiple commands produce
参考:https://stackoverflow.com/questions/52396637/build-error-xcode-10-multiple-commands-produce
If you use CocoaPods, click Xcode menu
file
->
Workspace Settings
, And click
Build system
choice
Legacy Build System
https://i.stack.imgur.com/FqiID.png
If you not use CocoaPods, same of top , select
Project Settings
4.--no-package-directories:
使用这个命令,就会在output Files的路径那里生成没有子包的转换文件,这样XCODE可以直接识别,但是类名不能重复,要不会覆盖掉.
如果不使用这个命令,可以生成有子包路径的转换文件,但是XCODE只会在output files的路径找文件,不会进入到子文件夹中,因此会找不到转换成功后的文件.
5.坑:
首先j2objc不是万能的,例如javax里面关于security和cypto的getInstance()方法就会报错,即使找到源码,转完把OC代码放进项目里面直接用也是报错的.
有时候通过xcode转是报错的,通过命令行反而会成功.可以转jar,但是jar必须是source jar
j2objc -d dest ./source/Test.jar --no-package-directories -use-arc