[JAVA] Messages qui peuvent être utiles pour les débutants JNI

introduction

C'est un titre terrible. J'ai eu récemment l'occasion d'entrer en contact avec JNI, donc pour rappel, ** "Jusqu'à ce que les débutants JNI exécutent du code natif (dll) sur JNI" ** Je voudrais écrire facilement.


Remarquer


Environnement de développement


JNI Qu'est-ce que #?

~~ Cliquez sur le lien pour lire. ~~ "Celui qui exécute le code natif de Java" (approprié)


Honnêtement JNI ...


Avant d'utiliser ...


Vous pouvez écrire ce code en Java

Plus tard, si vous êtes coincé avec "Pourquoi avez-vous utilisé JNI pour écrire en Java?", Il se peut que "Il vaut mieux écrire en Java sans utiliser JNI."


JNA ou SWIG est (probablement) plus facile à écrire

JNI doit modifier le côté code natif. Si vous ne vous souciez pas des performances, pensez à JNA et SWIG. Et soyez heureux. sûrement.


[Triste nouvelle] Java 64 bits ne peut pas appeler la DLL 32 bits

Alors faisons correspondre correctement. Si vous souhaitez exécuter sur Java 64 bits, utilisez une DLL 64 bits.


Le code natif prend-il en charge le multithreading?

Sinon, une tragédie peut survenir. Traitons-y si nécessaire. Si c'est impossible, écrivez un wrapper et contrôlez-le exclusivement ... (C'est difficile ...).


Enfin, utilisez JNI


Appel de la source Java (JNISample.java)

package com.hoge.jnisample;

public class JNISample {
  //Déclaration de fonction native
  private native String nativeFunction(String name);

  //Chargez le module à exécuter
  static {
    System.loadLibrary("libfuga");
  }

  //Exécution de code natif
  public String executeNative(String name) {
    return this.nativeFunction(name);
  }
}

Générer le fichier de classe (JNISample.class)

Compilez la source ci-dessus pour générer un fichier de classe (JNISample.class).

javac JNISample.java

Générer un en-tête natif

Utilisez la commande javah pour générer un en-tête C (C ++). La syntaxe de la commande est

javah -classpath {classpath} -d {Répertoire de sortie de l'en-tête} {(nom du paquet.) nom de la classe}

Cette fois, la structure des répertoires est la suivante.

java
└ com
  └ hoge
    └ jnisample
      ├ JNISample.java
      └ JNISample.class

La commande ressemble à ceci: (Exécutez dans le répertoire java)

javah -classpath .\ -d ..\jniheader com.hoge.jnisample.JNISample

Cela générera un fichier d'en-tête dans le répertoire jniheader, qui est au même niveau que le répertoire java.


Fichier d'en-tête généré (com_hoge_jnisample_JNISample.h)

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_hoge_jnisample_JNISample */

#ifndef _Included_com_hoge_jnisample_JNISample
#define _Included_com_hoge_jnisample_JNISample
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_hoge_jnisample_JNISample
 * Method:    nativeFunction
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_hoge_jnisample_JNISample_nativeFunction
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

Tout ce que vous avez à faire est d'implémenter la fonction en C (C ++) et de la construire!

mais,


Dernière tâche: ajouter le chemin du module natif à la variable d'environnement PATH


Maintenant, exécutez

Cela a-t-il fonctionné?


Résumé

JNI, ce n'est pas étonnamment difficile, n'est-ce pas? C'était une image plus difficile, mais j'étais soulagé à Ponkotsuenji. Nous espérons que vous trouverez cet article utile à tous les débutants JNI.


Note de l'éditeur

Beaucoup d'omissions en seconde période. Je le regrette sincèrement. Je l'ai écrit pour le mode diapositive, mais il est difficile à lire en mode normal.

Recommended Posts

Messages qui peuvent être utiles pour les débutants JNI
Outils et commandes pouvant être utiles pour le dépannage Java
[Débutant] Commandes et connaissances qui peuvent être utiles pour la résolution des erreurs lors du déploiement d'AWS
[Pour les débutants] Pouvons nous enduire comme Swift!