在j2objc中确定当前平台

时间:2015-03-21 16:02:11

标签: j2objc

使用j2objc时,确定当前平台(Android与iOS)的最佳方法是什么?

或者更一般的问题:如何在Android和iOS上使用不同的代码,例如在处理数据库访问或网络时?

1 个答案:

答案 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 patternsbuild 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");
}