ubuntu下使用java调用已经编译好的c++工程

使用java调用已经编译好的c++工程,比如pcl库
pcl及相关依赖库已经在ubuntu系统中安装好,现在要写一个cpp文件来使用pcl,然后在java中对其进行调用。基本思路与Ubuntu下使用java调用c++编译生成的so文件记录一致

1.编写java文件

JNIDemo.java

public class JNIDemo {
    static {
//        System.out.println(System.getProperty("java.library.path"));
//        System.loadLibrary("libTestJni");
        System.load("/home/dj/IdeaProjects/JNITest/src/libTestJni.so");
    }

    public native int add(int a, int b);
    public native void pclTest();//调用pcl的方法

    public static void main(String[] args) {
        JNIDemo test = new JNIDemo();
        int result = test.add(5, 6);
        test.pclTest();
        System.out.println(result);
    }

2.将其编译成.h头文件

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class JNIDemo */

#ifndef _Included_JNIDemo
#define _Included_JNIDemo
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     JNIDemo
 * Method:    add
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_JNIDemo_add
  (JNIEnv *, jobject, jint, jint);

/*
 * Class:     JNIDemo
 * Method:    pclTest
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_JNIDemo_pclTest
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

3.编写c++文件

pcl_test.cpp

#include "JNIDemo.h"
#include "iostream"
//#include "head.h"
#include "pcl/common/common_headers.h"
//#include "pcl/io/pcd_io.h"
//#include "pcl/visualization/pcl_visualizer.h"
//#include "pcl/visualization/cloud_viewer.h"
#include "pcl/console/parse.h"
using namespace std; 

JNIEXPORT jint JNICALL Java_JNIDemo_add(JNIEnv *env, jobject obj, jint a, jint b){
        return a+b;
}

 
JNIEXPORT void JNICALL Java_JNIDemo_pclTest(JNIEnv *env, jobject obj) {
//cout << "Programming is great fun!";    
//std::cout << "Test PCL !!!" << std::endl;
std::cout << "Test PCL !!!" << std::endl;

    pcl::PointCloud<pcl::PointXYZRGB>::Ptr point_cloud_ptr (new pcl::PointCloud<pcl::PointXYZRGB>);
	std::cout << point_cloud_ptr << std::endl;
	std::cout << "finish" << std::endl;
	uint8_t r(255), g(15), b(15);
    for (float z(-1.0); z <= 1.0; z += 0.05)
    {
      for (float angle(0.0); angle <= 360.0; angle += 5.0)
      {
        pcl::PointXYZRGB point;
        point.x = 0.5 * cosf (pcl::deg2rad(angle));
        point.y = sinf (pcl::deg2rad(angle));
        point.z = z;
        uint32_t rgb = (static_cast<uint32_t>(r) << 16 |
                static_cast<uint32_t>(g) << 8 | static_cast<uint32_t>(b));
        point.rgb = *reinterpret_cast<float*>(&rgb);
        point_cloud_ptr->points.push_back (point);
	    std::cout << point.x << std::endl;
        std::cout << point.y << std::endl;
        std::cout << point.z << std::endl;
      }
      if (z < 0.0)
      {
        r -= 12;
        g += 12;
      }
      else
      {
        g -= 12;
        b += 12;
      }
    }
    point_cloud_ptr->width = (int) point_cloud_ptr->points.size ();
    point_cloud_ptr->height = 1;
    std::cout << "test over" << std::endl;
    //return 0;
}

为验证是否可以使用pcl,在代码里输出一些相关信息

4.将c++代码编译成so

g++ -fPIC -I/usr/lib/jvm/jdk1.8.0_291/include/ -I/usr/lib/jvm/jdk1.8.0_291/include/linux/ -I/usr/local/include/pcl-1.8 -I/usr/include/eigen3 -I/usr/local/include/vtk-7.1 -shared -o libTestJni.so pcl_test.cpp

注意这里要指定pcl相关头文件的路径,否则会报错,找不到那个文件

$ g++ -fPIC -I/usr/lib/jvm/jdk1.8.0_291/include/ -I/usr/lib/jvm/jdk1.8.0_291/include/linux/ -shared -o libTestJni.so pcl_test.cpp
pcl_test.cpp:3:39: fatal error: pcl/common/common_headers.h: 没有那个文件或目录
指定pcl相关头文件的路径
-I/usr/local/include/pcl-1.8 -I/usr/include/eigen3 -I/usr/local/include/vtk-7.1

但在代码include以下头文件编译不会报错,但运行会报错,还未找到原因,所以这里先注释掉

//#include "pcl/io/pcd_io.h"
//#include "pcl/visualization/pcl_visualizer.h"
//#include "pcl/visualization/cloud_viewer.h"

报错信息:

Exception in thread "main" java.lang.UnsatisfiedLinkError: /JNITest/src/libTestJni.so: /JNITest/src/libTestJni.so: undefined symbol: _ZN5boost6system16generic_categoryEv
	at java.lang.ClassLoader$NativeLibrary.load(Native Method)
	at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1934)
	at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1817)
	at java.lang.Runtime.load0(Runtime.java:810)
	at java.lang.System.load(System.java:1086)
	at JNIDemo.<clinit>(JNIDemo.java:5)

参考博客:
dlopen 调用动态库SO文件报错: undefined symbol 问题解决方法
undefined reference to symbol ‘_ZN5boost6system15system_categoryEv’
在这里插入图片描述

5.运行java

在这里插入图片描述
可以看到已经成功调用pcl。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值