French Inline Java Code : vous y comprenez quelque chose ?

lemonisdead

Well-Known Member
Licensed User
Longtime User
Hello,

Je m'arrache les cheveux en tentant de comprendre le mini tuto de Erel à propos de Inline Java Code (https://www.b4x.com/android/forum/threads/inline-java-code.50141/#content). Mais c'est hors de mes capacités. Je suis vraiment mauvaise.
Je ne comprends pas :
- pourquoi on initialise un contexte à NativeMe
- pourquoi on passe un null à la classe FirstMethod

Cela ne va pas m'empêcher de dormir, après tout je n'ai encore rien compris à l'usage de JavaObject mais j'aimerais bien me coucher moins bête. D'autant plus que ces questions me reviennent régulièrement en mémoire mais à chaque fois j'abandonne.

Si une âme charitable passait par là :)
 

Laurent95

Active Member
Licensed User
Longtime User
Hello,

Je m'arrache les cheveux en tentant de comprendre le mini tuto de Erel à propos de Inline Java Code (https://www.b4x.com/android/forum/threads/inline-java-code.50141/#content). Mais c'est hors de mes capacités. Je suis vraiment mauvaise.
Je ne comprends pas :
- pourquoi on initialise un contexte à NativeMe
- pourquoi on passe un null à la classe FirstMethod

Cela ne va pas m'empêcher de dormir, après tout je n'ai encore rien compris à l'usage de JavaObject mais j'aimerais bien me coucher moins bête. D'autant plus que ces questions me reviennent régulièrement en mémoire mais à chaque fois j'abandonne.

Si une âme charitable passait par là :)

Bonjour,

Cela apporte la faculté de "surcharger" l'exécution du code natif Java pendant son exécution, d'où l'initialisation d'un contexte pour l'adresser.
Le Null passé à l'instanciation de FirstMethod est utilisé car il n'y a pas de paramètres à passer, cela ne fait qu'afficher "Hello World".
Bien entendu si des paramètres sont requis il faudra les passer.

Le Inline Java comme le JavaObject peut être utilisé pour interagir avec l'environnement Java et donc celui d'Android, par exemple lors de la construction d'une fenêtre (form) ou d'un objet pour lui changer son look.
C'est une option qui reste d'un niveau de programmation assez élevé et nécessite de comprendre comment Java fonctionne mais aussi les routines utilisées lors de la création des objets ou lors des événements pour ces objets.
Pas vraiment une option utile pour de la programmation simple mais plutôt pour de la programmation avancée, par exemple là où il est nécessaire d'agir avant que l'utilisateur ou l'OS n'intervienne parfois.
On utilisait à peu près la même chose sous VB, C++, etc. avec la surcharge et/ou l'appel de DLL. Ce qui permettait d'agir au niveau de l'OS pendant la construction de l'application et non lors de l'exécution de l'application, ou aussi pendant la réponse aux évenements.

Un des cas de figure avec B4A, cela permet, comme le dit Erel dans le tuto, de charger des SDK tiers (sous forme de Jar) non reconnus nativement dans l'environnement BA4 car pas de librairies d'implémentées.
Je pense les jeux par exemple ou les Ads publicitaires, mais il y a aussi plein d'autres possibilités.

Je n'ai pas encore implémenter ni JavaObject ni Inline Java, pas de besoin réel à ce jour., mais cela reste intéressant dans certains cas de figure.
Par contre je soupçonne que cela n'est pas pris en compte dans l'obfuscation, donc cette partie du code n'est plus "protégée".
Si tant est que l'obfuscation soit une réelle protection :)

Bonne nuit maintenant peut être ;)
 

Informatix

Expert
Licensed User
Longtime User
Très honnêtement, je n'ai pas tout compris à la première lecture du tuto d'Erel non plus. Pourtant c'est super simple: tu écris ton code Java entre les deux balises #If JAVA et #End If et tu utilises la fonction RunMethod de la librairie JavaObject pour appeler les fonctions que tu viens d'écrire en Java. Voici un cas concret avec des routines de tri de tableau:
B4X:
#If JAVA
    static java.util.Comparator<_typobjet> ComparerDesc = new java.util.Comparator<_typobjet>()
    {
        @Override
        public int compare(_typobjet s1, _typobjet s2) {
            if (s1.Index == s2.Index)
                return 0;
            else if (s1.Index > s2.Index)
                return -1;
            else
                return 1;
        }
    };

    public static void TrierIndex()
    {
        java.util.Arrays.sort(_pool_objets, ComparerDesc);
    }

    static java.util.Comparator<_typobjet> ComparerAsc = new java.util.Comparator<_typobjet>()
    {
        @Override
        public int compare(_typobjet s1, _typobjet s2) {
            if (s1.Index == s2.Index)
                return 0;
            else if (s1.Index > s2.Index)
                return 1;
            else
                return -1;
        }
    };

    public static void TrierIndex2(_typobjet[] Pool, int JusquA)
    {
        java.util.Arrays.sort(Pool, 0, JusquA, ComparerAsc);
    }
#End if
Pour appeler mes fonctions TrierIndex, je dois faire appel à RunMethod donc je crée une instance de la classe JavaObject:
B4X:
Private CodeJava As JavaObject
CodeJava.InitializeStatic(Application.PackageName & ".codpool")
Mon code Java se trouve dans le module de code codPool. Les modules de code sont des classes statiques en Java d'où InitializeStatic (on va faire appel à une fonction statique). Ensuite, je n'ai plus qu'à exécuter RunMethod en passant les paramètres de la fonction dans un tableau (ou null si pas de paramètres). Par exemple:
B4X:
CodeJava.RunMethod("TrierIndex2", Array(Pool, JusquA))

Une astuce: B4A renomme la plupart de tes variables et classes en minuscules avec un _ devant. Donc, dans mon code Java, _typobjet est le nom généré par B4A pour:
Type typObjet(Index As Int, Obj As Object)
Tu peux vérifier dans le source Java généré par B4A le nom des variables ou des classes si tu as un doute.
 
Last edited:
Top