java呼叫C程式碼--linux--eclipse
阿新 • • 發佈:2022-06-01
這裡使用JNI的方法,好像還有 JNA 和另外一種方法。
首先寫一個和C函式宣告一樣的Java函式,並宣告為 native
public class Test {
public static native void echo(int a);
}
然後開始製作動態庫
第一步:編寫C函式
標頭檔案用 javac -h ./ filename.java
自動生成
然後把建立.c檔案(把標頭檔案的.h改成.c即可)
然後把 標頭檔案中的函式生命複製到.c中
然後就可以編寫C程式碼實現C函數了
特別注意,標頭檔案中的函式宣告只給了“形參的資料型別”,但是沒有給“形參的名字”
JNIEXPORT void JNICALL Java_com_Test_echo(JNIEnv *, jclass, jint);
com_Test.c
#include <stdio.h>
#include "com_Test.h"
JNIEXPORT void JNICALL Java_com_Test_echo(JNIEnv *env, jclass cl, jint a){
printf("hello echo %d\n",a);
}
還是貼一下自動生成的標頭檔案吧
com_Test.h
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_Test */ #ifndef _Included_com_Test #define _Included_com_Test #ifdef __cplusplus extern "C" { #endif /* * Class: com_Test * Method: echo * Signature: (I)V */ JNIEXPORT void JNICALL Java_com_Test_echo (JNIEnv *, jclass, jint); #ifdef __cplusplus } #endif #endif
第二步:使用gcc建立動態庫
gcc -fPIC -I/usr/local/java/jdk-17.0.1/include -I/usr/local/java/jdk-17.0.1/include/linux/ -shared -o libxxx.so xxxx.c
特別提醒:千萬別忘了 libxxx.so 的字首 lib !動態庫的名字就是xxx,lib是字首,.so是字尾,都不屬於動態庫的名字!
最後呼叫動態庫
把 libxxx.so 放到 /usr/java/packages/lib 或者 /lib 或者 /usr/lib 或者 /usr/lib64 之中
然後編寫 java 程式碼進行測試
package com; public class Call { public static native void echo(int a); public static void main(String[] args) { System.loadLibrary("echo"); Test.echo(99); } }
成功執行