J2ObjC 支援將 Objective-C 嵌入 Java 原生方法,與
GWT 的 JSNI 支援
JavaScript 嵌入。J2ObjC 嵌入與 GWT 的主要差異在於
/*-[
和 ]-*/
為 Objective-C 程式碼。這個設施稱為 OCNI (Objective-C
原生介面),用來區分本身與 GWT 的 JSNI。
以下是 JRE 模擬程式庫的 java.lang.System
版本中的範例:
public static native long currentTimeMillis() /*-[
// Use NSDate
return (long long) ([[NSDate date] timeIntervalSince1970] * 1000);
]-*/;
J2ObjC 複製註解 (減去分隔符號),以建立方法主體:
+ (long long int)currentTimeMillis {
// Use NSDate
return (long long) ([[NSDate date] timeIntervalSince1970] * 1000);
}
原生匯入
J2ObjC 會掃描要翻譯的 Java 程式碼,為其依附元件新增 #import 指令 如同匯入基礎架構不過,只需要原生程式碼即可進行匯入 分別新增如要新增匯入項目,請在 Java 來源檔案的第一個類別上方新增 OCNI 區段 並在其中指定匯入項目例如:
package my.project;
/*-[
#import "java/lang/NullPointerException.h"
]-*/
public class Test {
native void test() /*-[
@throw [[JavaLangNullPointerException alloc] init];
]-*/;
}
上述範例必須匯入,因為這個類型參考的唯一地點 原生程式碼
原生區塊
在類別主體中,J2ObjC 會掃描 OCNI 區塊。這些封鎖條件是未經修改的 檔案,與已翻譯的班級成員相對。範例如下:
/*-[
static void log(NSString *msg) {
NSLog(@"%@", msg);
}
]-*/;
此 C 函式可從這個 OCNI 區塊之後宣告的任何原生方法叫用。
這個 OCNI 區塊的特殊變化版本會改為在產生的標頭中插入程式碼
.m 檔案:/*-HEADER[...]
透過原生程式碼叫用 Java 方法
public native void bar(JSNIExample x, String s) /*-[
// Call instance method instanceFoo() on this
[self instanceFooWithNSString:s];
// Call instance method instanceFoo() on x
[x instanceFooWithNSString:s];
// Call static method staticFoo()
JSNIExample_staticFooWithNSString_(s);
]-*/;
從原生程式碼存取欄位
如要讀取執行個體欄位,請使用 myInstanceField_
或
self->myInstanceField_
。結尾的後置字串可避免與方法衝突
名稱相同
請注意,含有保留名稱的欄位會有兩條底線。例如: 名為「id」的欄位在 Java 中是合法的,但在目標 C 中則不行。翻譯完成後 該欄位將命名為「id__」。因此,請檢查系統產生的檔案 有「沒有道德」編譯器錯誤。
如要寫入物件執行個體欄位,請使用 JSNIExample_set_myInstanceField(string)
讀取靜態欄位:JSNIExample_get_myStaticField()
寫入靜態欄位:JSNIExample_set_myStaticField(value)
J2ObjC 和 GWT
選擇不同的分隔符號,因此接下來的 J2ObjC 版本會加入 GWT JSNI 註解。 已忽略 (先前使用相同的分隔符號做為 GWT)。這表示單一 Java 原始碼 都具備實作 Objective-C、GWT 和 Android (透過 JNI) 的原生方法:
static native void log(String text) /*-{ // left-brace for JavaScript
console.log(text);
}-*/ /*-[ // left-bracket for Objective-C
NSLog(@"%@", text);
]-*/;
J2ObjC 和 Android
J2ObjC 和 Android 原生方法實作「只是正常運作」,因為 Android 原生方法 在獨立的 JNI C 或 C++ 檔案中實作。在下列情況下,Java 類別中的所有 OCNI 註解都會遭到移除 Android 或其他 Java 平台的 javac 編譯而成。