Java プログラムを Objective-C プログラムに変換してくれる天下のグーグル謹製プロジェクト J2ObjC 。
興味を持ったので試してみた。
何はともあれビルド。
ビルド
公式のページに従う。
注意点としては・・・。
PROTOBUF_ROOT_DIR=/usr/local
を .zprofile あたりに追記。この時に
PROTOBUF_ROOT_DIR='/usr/local'
とやってしまうと文字列と判定されてしまうので、ビルド途上でおこられます。
並列ビルドも失敗しやすいようなので、まず
make -j4 dist
と最低限のコンパイルを片付けてしまい、必要に応じて
make frameworks
make all_frameworks
とするといいと思う。
Hello World
ビルドはとんでもなく時間がかかるので、すぐにできる j2objc, j2objcc を使ってハロワしてみよう。
公式ページにある Hello.java
public class Hello {
public static void main(String[] args) {
System.out.println("hello, world");
}
}
を
j2objc Hello.java
すると同名の .m ファイル(Hello.m)ができる。
#define J2OBJC_IMPORTED_BY_JAVA_IMPLEMENTATION 1
#include "Hello.h"
#include "IOSObjectArray.h"
#include "J2ObjC_source.h"
#include "java/io/PrintStream.h"
#include "java/lang/System.h"
#if __has_feature(objc_arc)
#error "Hello must not be compiled with ARC (-fobjc-arc)"
#endif
#pragma clang diagnostic error "-Wreturn-type"
#pragma clang diagnostic ignored "-Wswitch"
@implementation Hello
J2OBJC_IGNORE_DESIGNATED_BEGIN
- (instancetype)init {
Hello_init(self);
return self;
}
J2OBJC_IGNORE_DESIGNATED_END
+ (void)mainWithNSStringArray:(IOSObjectArray *)args {
Hello_mainWithNSStringArray_(args);
}
+ (const J2ObjcClassInfo *)__metadata {
static J2ObjcMethodInfo methods[] = {
{ NULL, NULL, 0x1, -1, -1, -1, -1, -1, -1 },
{ NULL, "V", 0x9, 0, 1, -1, -1, -1, -1 },
};
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-multiple-method-names"
#pragma clang diagnostic ignored "-Wundeclared-selector"
methods[0].selector = @selector(init);
methods[1].selector = @selector(mainWithNSStringArray:);
#pragma clang diagnostic pop
static const void *ptrTable[] = { "main", "[LNSString;" };
static const J2ObjcClassInfo _Hello = { "Hello", NULL, ptrTable, methods, NULL, 7, 0x1, 2, 0, -1, -1, -1, -1, -1 };
return &_Hello;
}
@end
void Hello_init(Hello *self) {
NSObject_init(self);
}
Hello *new_Hello_init() {
J2OBJC_NEW_IMPL(Hello, init)
}
Hello *create_Hello_init() {
J2OBJC_CREATE_IMPL(Hello, init)
}
void Hello_mainWithNSStringArray_(IOSObjectArray *args) {
Hello_initialize();
[((JavaIoPrintStream *) nil_chk(JreLoadStatic(JavaLangSystem, out))) printlnWithNSString:@"hello, world"];
}
J2OBJC_CLASS_TYPE_LITERAL_SOURCE(Hello)
おお、Objective-C じゃん!
次に
j2objcc -c Hello.m
j2objcc -o hello Hello.o
として実行バイナリ hello をつくる。
% ./hello Hello
hello, world
おおお。
Java リバーシアプリを iPhone アプリに
そうこうするうちに dist フォルダに生成物ができていたので、これを利用して Xcode プロジェクトのサンプルを試してみた。
公式が Java reversi プログラムを Xcode 上でビルドするサンプルを紹介していたので、これにトライする。
ほぼそのままで動きました。
JRE.framework を JRE.xcframework にするくらいの変更でOK牧場。

すげ。
(続く)




