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);
}
}
成功执行