3

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

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

4

1 回答 1

5

要确定当前平台,请使用System.getProperty("os.name"). j2objc 翻译的应用程序将返回“iPhone”、“iPhone Simulator”或“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 模式使用 Android NDK进行构建。这是关于在 Android 上开始使用 JNI的讨论。这些步骤是使用本机代码在您的类文件上运行 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");
}
于 2015-03-21T16:54:50.873 回答