使用java JNI完成对c++代码的调用
参考博客:
JNI
Linux平台Java调用so库-JNI使用例子
ubuntu下使用JNI Java调用C++的例子
在Ubuntu18.04中使用JNI实现java调用C++
springboot环境下java调用c程序生成动态链接库(基于JNI,linux环境下运行)
ubuntu下java调用c++动态库
Linux平台使用JNI Java调用so
java 调用.so文件_java调用so文件
JNA
Linux系统上java调用C++ so库文件
linux操作系统下 实现java调用so文件
Linux系统上java调用C++ so库文件
1.编写java代码
demo.java
public class demo {
static {
System.out.println(System.getProperty("java.library.path"));
// System.loadLibrary("libTestJni");
System.load("/media/smartcity/E6AA1145AA1113A1/GuoTai/JNITest/src/libTestJni.so");
}
public native int add(int a, int b);
public static void main(String[] args) {
demo test = new demo();
int result = test.add(5, 6);
System.out.println(result);
}
}
2.编译java文件生成.h头文件,编译java生成class文件
javah -jni demo
javac demo.java
demo.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class demo */
#ifndef _Included_demo
#define _Included_demo
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: demo
* Method: add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_demo_add
(JNIEnv *, jobject, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
3.编写对应的c++代码:test_JNI.cpp
#include "demo.h"
#include<iostream>
using namespace std;
JNIEXPORT jint JNICALL Java_demo_add(JNIEnv *env, jobject obj, jint a, jint b){
return a+b;
}
4.g++编译c++代码生成so文件
g++ -fPIC -I /jdk1.8.0/include/ -I /jdk1.8.0/include/linux/ -shared -o libTestJni.so test_JNI.cpp
其中,/jdk1.8.0/include/是jni.h文件所在的路径,/jdk1.8.0/include/linux/是jni_md.h文件所在的路径
5.执行java文件,输出结果
java demo
也可直接在idea中执行
所有文件如下:
问题
使用System.loadlibrary时报错
System.loadLibrary("libTestJni");
Exception in thread "main" java.lang.UnsatisfiedLinkError: no libTestJni in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860)
at java.lang.Runtime.loadLibrary0(Runtime.java:871)
at java.lang.System.loadLibrary(System.java:1122)
at demo.<clinit>(demo.java:4)
Process finished with exit code 1
在/etc/profile中添加export LD_LIBRARY_PATH=$PATH
仍然报错,故先使用System.load加载so文件