天天看点

[IOS]How to use J2Objc

一.下载:

​​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