确定 j2objc 中的当前平台

Determine current platform in j2objc

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

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

要确定当前平台,请使用 System.getProperty("os.name")。 j2objc 翻译的应用程序将 return "iPhone"、"iPhone Simulator" 或 "Mac OS X".

对于Android和iOS上的运行不同代码,通常定义一个接口或者抽象class作为API共享代码使用,然后 implement/subclass 与 Android 和 iOS 版本。您可以使用上面的 os.name 测试在 运行 时动态加载正确的 class。

如果 Android 和 iOS 版本之间的唯一区别是本机代码,但是,可以共享一个 class。因为 OCNI 个本机片段在 Java 个注释中,所以当使用 javac 编译时它们会消失。所以一个 class 与 native 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 to build with the Android NDK. Here is a discussion on getting started with JNI on Android。这些步骤是 运行 使用本机代码在 class 文件上进行 javah 以创建 .h 头文件,然后编写实现每个功能的匹配 C 或 C++ 文件。这是上述 class 的 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 可以找到并 运行 您的本机代码。将此添加到上面 class:

static {
  System.loadLibrary("mydatasrc");
}