使用j2objc时,确定当前平台(Android与iOS)的最佳方法是什么?
或者更一般的问题:如何在Android和iOS上使用不同的代码,例如在处理数据库访问或网络时?
答案 0 :(得分:5)
要确定当前平台,请使用System.getProperty("os.name")
。一个j2objc翻译的应用程序将返回" iPhone"," iPhone模拟器"或" Mac OS X"。
要在Android和iOS上运行不同的代码,将接口或抽象类定义为共享代码使用的API,然后使用Android和iOS版本实现/子类是很常见的。您可以使用上面的os.name测试在运行时动态加载正确的类。
如果Android和iOS版本之间的唯一区别是本机代码,则可以共享单个类。因为OCNI本机代码片段在Java注释中,所以当使用javac编译时它们会消失。因此,一个具有原生Objective C的类可以在所有平台上运行:
class MyDataSource {
native int readCustomerCount()/*-[
<iOS Objective C code>
]-*/;
native void writeCustomerCount(int count)/*-[
<iOS Objective C code>
]-*/;
}
所有javac都看到了:
class MyDataSource {
native int readCustomerCount();
native void writeCustomerCount(int count);
}
接下来,关注JNI patterns至build with the Android NDK。以下是对getting started with JNI on Android的讨论。步骤是使用本机代码在类文件上运行javah以创建.h头文件,然后编写实现每个函数的匹配C或C ++文件。这是上述类的JNI头文件(减去注释):
/* Header for class MyDataSource */
#include <jni.h>
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT jint JNICALL Java_MyDataSource_readCustomerCount
(JNIEnv *, jobject);
JNIEXPORT void JNICALL Java_MyDataSource_writeCustomerCount
(JNIEnv *, jobject, jint);
#ifdef __cplusplus
}
#endif
最后一步是加载本机库,以便JVM可以找到并运行您的本机代码。将其添加到上面的类:
static {
System.loadLibrary("mydatasrc");
}