1. 程式人生 > 其它 >java呼叫C程式碼--linux--eclipse

java呼叫C程式碼--linux--eclipse

這裡使用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);
	}

}

成功執行