J2ObjC:如何翻译自己的类型

时间:2018-01-30 17:13:21

标签: java objective-c j2objc

我想为特定于平台的代码创建类适配器。 例如,有两个类:

Java:

class SQLiteAdapter {
    public void executeSql() {
        //use android.database.sqlite
    }
}

目标C

@interface SQLiteAdapter : NSObject {}
- (void)executeSql;
@end

如何“教”J2ObjC转换java代码

SQLiteAdapter adapter = new SQLiteAdapter();
adapter.executeSql();

SQLiteAdapter* adapter =  [SQLiteAdapter alloc];
[adapter executeSql]

1 个答案:

答案 0 :(得分:1)

您可以使用sqlighter,这是一个兼容j2objc的库,可让您为Android和iOS编写一次数据库访问代码。由于它将SQLite库包装在两个平台上,因此很容易切换。

如果您真的想要实现自己的跨平台API,通常应用程序使用定义API的接口或抽象类,并使用依赖注入框架(如Dagger)加载每个平台的单独实现,或Java反射。

使用您的代码作为起点,首先使用抽象的executeSql()方法将SQLiteAdapter定义为抽象类:

public abstract class SQLiteAdapter {
  public abstract void executeSql();
}

接下来,定义一个扩展SQLiteAdapter并使用Android特定代码实现executeSql()的AndroidSQLiteAdapter:

class AndroidSQLiteAdapter extends SQLiteAdapter {
  public void executeSql() {
    //use android.database.sqlite
  }
}

最后,将SQLiteAdapter.java与j2objc一起翻译,并修改你的iOS类:

#import "SQLiteAdapter.h"
#import <sqlite3.h>

@interface IosSQLiteAdapter : SQLiteAdapter
@end

@implementation IosSQLiteAdapter
- (void)executeSql {
  // Implement using SQLite C API.
}
@end