Ubuntu下使用java调用c++编译生成的so文件记录

使用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文件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值