Es ist ein schrecklicher Titel. Ich hatte kürzlich die Gelegenheit, mit JNI in Kontakt zu treten. ** "Bis JNI-Anfänger nativen Code (DLL) auf JNI ausführen" ** Ich würde gerne einfach schreiben.
~~ Klicken Sie zum Lesen auf den Link. ~~ "Derjenige, der nativen Code von Java aus ausführt" (entsprechend)
Wenn Sie später nicht mehr mit "Warum haben Sie JNI zum Schreiben in Java verwendet?"
JNI muss die native Codeseite ändern. Wenn Sie sich nicht für die Leistung interessieren, ziehen Sie JNA und SWIG in Betracht. Und sei glücklich. sicherlich.
Also lasst es uns richtig zusammenbringen. Wenn Sie auf 64-Bit-Java ausführen möchten, verwenden Sie die 64-Bit-DLL.
Wenn nicht, kann es zu einer Tragödie kommen. Lassen Sie uns bei Bedarf damit umgehen. Wenn es unmöglich ist, schreibe einen Wrapper und kontrolliere ihn ausschließlich ... (Es ist schwer ...).
JNISample.java
)package com.hoge.jnisample;
public class JNISample {
//Native Funktionsdeklaration
private native String nativeFunction(String name);
//Laden Sie das auszuführende Modul
static {
System.loadLibrary("libfuga");
}
//Native Code-Ausführung
public String executeNative(String name) {
return this.nativeFunction(name);
}
}
Kompilieren Sie die obige Quelle, um eine Klassendatei (JNISample.class) zu generieren.
javac JNISample.java
Verwenden Sie den Befehl javah
, um einen C (C ++) - Header zu generieren. Die Syntax des Befehls lautet
javah -classpath {classpath} -d {Header-Ausgabeverzeichnis} {(Paketnamen.) Name der Klasse}
Diesmal ist die Verzeichnisstruktur wie folgt.
java
└ com
└ hoge
└ jnisample
├ JNISample.java
└ JNISample.class
Der Befehl sieht folgendermaßen aus: (Im Java-Verzeichnis ausführen)
javah -classpath .\ -d ..\jniheader com.hoge.jnisample.JNISample
Dadurch wird eine Header-Datei im Verzeichnis "jniheader" generiert, die sich auf derselben Ebene befindet wie das Verzeichnis "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
aber,
jobject
, jstring
usw.) muss konvertiert werden.Hat es funktioniert?
JNI, es ist nicht überraschend schwierig, nicht wahr? Es war ein schwierigeres Bild, aber ich war in Ponkotsuenji erleichtert. Wir hoffen, dass Sie diesen Beitrag für alle JNI-Anfänger nützlich finden.
Viele Auslassungen in der zweiten Hälfte. Ich bereue es ehrlich. Ich habe es für den Dia-Modus geschrieben, aber im normalen Modus ist es schwer zu lesen.
Recommended Posts