确定 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");
}
在使用 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");
}