可参考百度经验文章:Linux系统java调用c/c++库(jni快速实现)
一、编写java文件,即使用者
注意System.load的参数要使用绝对路径,目前我是在/root下编写,到时候生成的so就在/root下,因此我使用的参数是"/root/libhello.so"
cd /root
vim Hello.java
class Hello{
private native void print_cpp();
public static void main(String[] args){
new Hello().print_cpp();
}
static{
System.load("/root/libhello.so");
}
}
二、编写头文件
javac Hello.java
javah -jni -classpath . Hello
然后就得到了头文件。
//Hello.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Hello */
#ifndef _Included_Hello
#define _Included_Hello
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Hello
* Method: print_cpp
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_Hello_print_1cpp
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
三、编写C++的实现文件,不能改函数名字或参数,只编写其实现
vim Hello.cpp
#include <iostream>
#include "Hello.h"
JNIEXPORT void JNICALL Java_Hello_print_1cpp
(JNIEnv *, jobject)
{
std::cout << "Hello C plus plus !!" << std::endl;
}
四、编译动态库so文件,注意/usr/local/java/jdk1.8.0_231是我的jdk文件所在路径
g++ -fpic -shared Hello.cpp -o libhello.so -I./ -I /usr/local/java/jdk1.8.0_231/include -I /usr/local/java/jdk1.8.0_231/include/linux
五、测试
java Hello
[root@VM_0_14_centos ~]# java Hello
Hello C plus plus !!