[JAVA] Beiträge, die für JNI-Anfänger nützlich sein können

Einführung

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.


Beachten


Entwicklungsumgebung


JNI Was ist #?

~~ Klicken Sie zum Lesen auf den Link. ~~ "Derjenige, der nativen Code von Java aus ausführt" (entsprechend)


Ehrlich JNI ...


Vor Gebrauch ...


Sie können diesen Code in Java schreiben

Wenn Sie später nicht mehr mit "Warum haben Sie JNI zum Schreiben in Java verwendet?"


JNA oder SWIG ist (wahrscheinlich) einfacher zu schreiben

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.


[Traurige Neuigkeiten] 64-Bit-Java kann keine 32-Bit-DLL aufrufen

Also lasst es uns richtig zusammenbringen. Wenn Sie auf 64-Bit-Java ausführen möchten, verwenden Sie die 64-Bit-DLL.


Unterstützt der native Code Multithreading?

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 ...).


Verwenden Sie schließlich JNI


Aufruf der Java-Quelle (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);
  }
}

Klassendatei generieren (JNISample.class)

Kompilieren Sie die obige Quelle, um eine Klassendatei (JNISample.class) zu generieren.

javac JNISample.java

Generieren Sie einen nativen Header

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".


Generierte Header-Datei (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

Alles was Sie tun müssen, ist die Funktion in C (C ++) zu implementieren und zu erstellen!

aber,


Letzte Aufgabe: Fügen Sie den Pfad des nativen Moduls zur Umgebungsvariablen PATH hinzu


Jetzt ausführen

Hat es funktioniert?


Zusammenfassung

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.


Anmerkung der Redaktion

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

Beiträge, die für JNI-Anfänger nützlich sein können
Tools und Befehle, die für die Fehlerbehebung in Java hilfreich sein können
[Anfänger] Befehle und Kenntnisse, die für die Fehlerbehebung bei der Bereitstellung von AWS hilfreich sein können
[Für Anfänger] Lassen Sie uns wie Swift beschichten!