現在、Javaを使用してLinuxまたはWindowsのシステムAPIを呼び出す必要があるか、C言語を実装する必要のあるローカルメソッドを呼び出す必要があります。
以下の完全な例を参照してください。
準備:Windowsの下にmingw-64コンパイラをインストール し、gccコマンドでコンパイルする
まず、Javaクラスファイルを作成します
Main.java
public class Main {
// 静态初始化代码块,保证虚拟机在第一次使用该类时就会装载库
static{
System.loadLibrary("MyNativeLib");
}
// native 关键字表示本地方法,提醒编译器该方法将在外部定义(注:不能包含_)
public static native void sayHello();
// 主函数调用本地方法
public static void main(String[] args) {
sayHello();
}
}
次に、.hヘッダーファイルを生成します。
> javac Main.java
> javah -classpath . -jni Main
上記のコマンドを使用して生成されたMain.hファイルの内容は次のとおりです。
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Main */
#ifndef _Included_Main
#define _Included_Main
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Main
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_Main_sayHello
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
3、C実装ファイルを作成する
Main.cファイルを作成して、ヘッダーファイルに関数を実装します。
#include <stdio.h>
#include "Main.h"
JNIEXPORT void JNICALL Java_Main_sayHello(JNIEnv *env, jobject c1) {
printf("Hello Native !!\n");
}
第4に、ダイナミックリンクライブラリをコンパイルして生成する
gccの-Iパラメーター(大文字のi)を使用して、ヘッダーファイルを見つける必要があるディレクトリを指定します。
または、JDKディレクトリの下のinclude / jni.hおよびinclude / win32 / jni_md.hを現在のプロジェクトディレクトリにコピーします。
次に、コマンドを実行します(Main.hの#include <jni.h>を#include "jni.h"に変更する前に、まず現在のディレクトリでヘッダーファイルを検索してから、システムディレクトリで検索します)。
> gcc -fPIC -shared -o MyNativeLib.dll Main.c
MyNativeLib.dllダイナミックリンクライブラリファイルがこのディレクトリに生成され、他のC言語ファイルを削除できます。
5、試運転
> java Main
実行結果は次のとおりです。
一般的な問題:
- java.lang.UnsatisfiedLinkError:クラス名、関数名()V
この時点で、ダイナミックライブラリがロードされています。.hファイルと.cファイルの関数名が一致しているかどうか、および名前に下線_を付けることができないかどうかを確認してください。
cファイルの関数名は、通常のJava_Main_sayHello、Java_class name_function nameです。
- java.lang.ClassLoader.loadLibrary(Unknown Source)のjava.library.pathにMyNativeLibがない
どのdllライブラリも正常にロードされない場合は、対応するdllが正常に生成されているかどうか、コンパイルコマンドが正しいかどうか、プロジェクトの場所などを確認してください。
- Linux環境でのコンパイルは上記と同じで、動的ライブラリファイルの拡張子は.soです。