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);
	}

}

成功执行

posted @ 2022-06-01 21:41  191206  阅读(129)  评论(0编辑  收藏  举报