J2ObjC prend en charge l'intégration d'Objective-C dans des méthodes natives Java, de la même manière que
La bibliothèque JSNI de GWT accepte
l'intégration JavaScript. La principale différence entre la représentation vectorielle continue J2ObjC et celle de GWT est que J2ObjC utilise
/*-[
et ]-*/
pour délimiter le code Objective-C. Cette fonction est appelée OCNI (Objective-C),
Native Interface), afin de se différencier du code JSNI de GWT.
Voici un exemple issu de la version de java.lang.System
de la bibliothèque d'émulation JRE:
public static native long currentTimeMillis() /*-[
// Use NSDate
return (long long) ([[NSDate date] timeIntervalSince1970] * 1000);
]-*/;
J2ObjC copie le commentaire, moins les délimiteurs, pour créer le corps de la méthode:
+ (long long int)currentTimeMillis {
// Use NSDate
return (long long) ([[NSDate date] timeIntervalSince1970] * 1000);
}
Importations natives
J2ObjC analyse le code Java en cours de traduction afin d'ajouter des directives #import pour ses dépendances. que l'importation du framework Foundation. Cependant, toute importation nécessaire uniquement par le code natif doit être séparément. Pour ajouter des importations, ajoutez une section OCNI au-dessus de la première classe dans le fichier source Java et y spécifier les importations. Par exemple:
package my.project;
/*-[
#import "java/lang/NullPointerException.h"
]-*/
public class Test {
native void test() /*-[
@throw [[JavaLangNullPointerException alloc] init];
]-*/;
}
L'importation est nécessaire dans l'exemple ci-dessus, car le seul endroit où ce type est référencé se trouve du code natif.
Blocs natifs
Dans un corps de classe, J2ObjC recherche les blocs OCNI. Ces blocs sont ajoutés sans modification fichier traduit, à la même position par rapport aux membres de la classe traduits. Exemple :
/*-[
static void log(NSString *msg) {
NSLog(@"%@", msg);
}
]-*/;
Cette fonction C peut être appelée à partir de n'importe quelle méthode native déclarée après ce bloc OCNI.
Une variante spéciale de ce bloc OCNI insère du code dans l'en-tête généré à la place
du fichier .m: /*-HEADER[...]
Appeler des méthodes Java à partir de code natif
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);
]-*/;
Accéder aux champs à partir du code natif
Pour lire un champ d'instance, utilisez myInstanceField_
ou
self->myInstanceField_
Le suffixe final évite un conflit avec les méthodes
portant le même nom.
Notez que les champs ayant des noms réservés comportent deux traits de soulignement. Par exemple : un champ nommé "id" est légal en Java, mais pas dans Objective C. Une fois traduites, ce champ est nommé "id__". Veuillez donc vérifier les fichiers générés si il y a des « no-such-field » les erreurs de compilation.
Pour écrire dans un champ d'instance d'objet, utilisez JSNIExample_set_myInstanceField(string)
.
Lire un champ statique: JSNIExample_get_myStaticField()
Écrivez un champ statique: JSNIExample_set_myStaticField(value)
J2ObjC et GWT
Différents délimiteurs ont été choisis pour que, dans la prochaine version J2ObjC, les commentaires JSNI GWT soient ignorés (auparavant, les mêmes délimiteurs étaient utilisés que GWT). Cela signifie qu'une seule source Java proposent des méthodes natives avec des implémentations Objective-C, GWT et Android (via JNI) :
static native void log(String text) /*-{ // left-brace for JavaScript
console.log(text);
}-*/ /*-[ // left-bracket for Objective-C
NSLog(@"%@", text);
]-*/;
J2ObjC et Android
Les implémentations de méthodes natives J2ObjC et Android "fonctionnent simplement", car les méthodes Android natives sont implémenté dans un fichier JNI C ou C++ distinct. Tous les commentaires OCNI dans les classes Java sont supprimés lorsque compilé par javac pour Android ou toute autre plateforme Java.