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.
~~ Cliquez sur le lien pour lire. ~~ "Celui qui exécute le code natif de Java" (approprié)
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."
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.
Alors faisons correspondre correctement. Si vous souhaitez exécuter sur Java 64 bits, utilisez une DLL 64 bits.
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 ...).
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);
}
}
Compilez la source ci-dessus pour générer un fichier de classe (JNISample.class).
javac JNISample.java
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
.
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
mais,
jni.h
aux" répertoires supplémentaires inclus ".jobject
, jstring
, etc.) nécessite une conversion.Cela a-t-il fonctionné?
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.
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