在j2objc中确定当前平台

gin*_*ngo 3 j2objc

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

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

小智 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>
  ]-*/;
}
Run Code Online (Sandbox Code Playgroud)

所有javac看到:

class MyDataSource {
  native int readCustomerCount();
  native void writeCustomerCount(int count);
}
Run Code Online (Sandbox Code Playgroud)

接下来,按照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
Run Code Online (Sandbox Code Playgroud)

最后一步是加载本机库,以便JVM可以找到并运行您的本机代码.将其添加到上面的类:

static {
  System.loadLibrary("mydatasrc");
}
Run Code Online (Sandbox Code Playgroud)