使用 j2objc 时确定当前平台(Android 与 iOS)的最佳方法是什么?
或者更一般的问题:如何为 Android 和 iOS 使用不同的代码,例如在处理数据库访问或网络时?
使用 j2objc 时确定当前平台(Android 与 iOS)的最佳方法是什么?
或者更一般的问题:如何为 Android 和 iOS 使用不同的代码,例如在处理数据库访问或网络时?
要确定当前平台,请使用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");
}