Java呼叫 C檔案
阿新 • • 發佈:2021-01-13
Java呼叫 C檔案
1、HelloJNI.java 原始檔檔案
public class HelloJNI { // 本地方法宣告 native void printHello(); native void printString(String str); // 載入庫 static { System.loadLibrary("hello"); } public static void main(String args[]) { HelloJNI myJNI = new HelloJNI(); // 呼叫本地方法(實際呼叫的事使用C語言編寫的JNI本地函式) myJNI.printHello(); myJNI.printString("Hello World from printString fun"); } }
2、javac HelloJNI.java 生成編譯檔案
3、javah HelloJNI 生成 標頭檔案
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class HelloJNI */ #ifndef _Included_HelloJNI #define _Included_HelloJNI #ifdef __cplusplus extern "C" { #endif /* * Class: HelloJNI * Method: printHello * Signature: ()V */ JNIEXPORT void JNICALL Java_HelloJNI_printHello (JNIEnv *, jobject); /* * Class: HelloJNI * Method: printString * Signature: (Ljava/lang/String;)V */ JNIEXPORT void JNICALL Java_HelloJNI_printString (JNIEnv *, jobject, jstring); #ifdef __cplusplus } #endif #endif
4、HelloJNI.c c原始檔
#include "HelloJNI.h" #include <stdio.h> JNIEXPORT void JNICALL Java_HelloJNI_printHello(JNIEnv *env, jobject object) { printf("Hello World!\n"); return; } JNIEXPORT void JNICALL Java_HelloJNI_printString(JNIEnv *env, jobject object, jstring string) { // 將 Java String轉換為C字串 const char *str = (*env)->GetStringUTFChars(env,string,0); printf("%s!\n", str); return; }
5、生成共享庫檔案
5、gcc -dynamiclib -I /Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/include/ HelloJNI.c -o libhello.jnilib
生成各個平臺的共享庫
Windows .dll
Linux .so
Mac .jnilib
註釋:
In file included from HelloWorldImpl.c:1:
/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home/include/jni.h:45:10: fatal error:
'jni_md.h' file not found
#include "jni_md.h"
^
1 error generated.
提示jni_md.h這個檔案找不到;我們執行下面的命令拷貝一份
sudo cp /Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/include/darwin/jni_md.h /Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/include
然後再執行生成動態庫的命令即可。