PART1:

    java中使用jna替代jni调用c++/c生成的 dll/so库文件需要做的事项

1、引入JNA依赖或者直接下载JNAjar包
 
                    <dependency>
                        <groupId>net.java.dev.jna</groupId>
                        <artifactId>jna</artifactId>
                        <version>5.2.0</version>
                    </dependency>
 
2、编写Java 调用类
 

        package com.tree.go.util;
import com.sun.jna.Library;
import com.sun.jna.Native; //继承Library,用于加载库文件 --Class mapping
public interface CPPTest extends Library {
// 加载libhello.so链接库
public static final String JNA_ImgProcess = "hello";
public static final CPPTest instance = (CPPTest)Native.loadLibrary(CPPTest.JNA_ImgProcess,CPPTest.class); // 此方法为链接库中的方法 function mapping
void test();
int addTest(int a,int b); //调用,singleton
public static void main(String[] args) {
CPPTest instance =CPPTest.instance;
instance.test();
int c =instance.addTest(10,20);
}
}

  

 
            
接下来的工作就是如何编写可供调用的Cpp文件,以及编译加载的问题了,查看part 2  

 
 

PART2:

    编写C++/C文件,编译

 
准备编写C++代码[T1.cpp],如下:
 
#include <iostream>
using namespace std; extern "C"{ //避免name mangling,编译后名称symbol破坏,导致无法找到函数,告诉编译器下面的代码块使用c编译器来编译
int addTest(int a, int b)
{
cout << "a+b" << a + b << endl;
return a + b;
}
void test()
{
cout << "hello word from C++ ! " << endl;
}
}

  

 
 
1、如何将C++文件编译为so文件?
 
    这里需要区分编译c文件和c++文件使用的是不同的编译器,具体编译参数可以复用
 
        1.1、编译c文件使用 gcc
    示例:
    使用命令:gcc -fPIC -shared -o libGoT.so  T1.c
 
 
        1.2、编译c++文件使用的是 g++
                                g++ -fPIC -shared -o libhello.so  T1.cpp
 
        编译完成后生成如下文件:
                    aaarticlea/png;base64,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" alt="" />
 
2、如何加载编译好的so文件?
 
         配置so文件加载位置:
打开  vim /etc/profile
添加如下配置:
/home/data/libso是自定义目录,
export LD_LIBRARY_PATH=/home/data/libso
多个目录用:隔开,如下
export LD_LIBRARY_PATH=/home/data/libso:/usr/lib
 
这样就可在Java中调用使用C程序编写好的代码了

 
 

PART3:

    注意事项:

1、C++编译后函数名称破环问题
        名称一致性问题,java中调用的和cpp文件中定义的名称需要保持一致
        解决:使用   extern "C"放到一句代码前,或者一段代码前 extern "C"{ your code}
    
 
2、   编译生成动态库名的问题
            注意在编译的时候一点要在库民前面加上  lib+soname.so
            否则JNA如法加载到库文件
            示例:我们需要一个hello库需要这样编译,前面加上lib
 
                 g++ -fPIC -shared -o libhello.so  T1.cpp
                    
        

linux动态库的命名规则

动态链接库的名字形式为 libxxx.so,前缀是lib,后缀名为“.so”。
  针对于实际库文件,每个共享库都有个特殊的名字“soname”。在程序启动后,程序通过这个名字来告诉动态加载器该载入哪个共享库。
  在文件系统中,soname仅是一个链接到实际动态库的链接。对于动态库而言,每个库实际上都有另一个名字给编译器来用。它是一个指向实际库镜像文件的链接文件(lib+soname+.so)。
 
 
 

显式调用C++动态库注意点

对C++来说,情况稍微复杂。显式加载一个C++动态库的困难一部分是因为C++的name mangling;另一部分是因为没有提供一个合适的API来装载类,在C++中,您可能要用到库中的一个类,而这需要创建该类的一个实例,这不容易做到。
name mangling可以通过extern "C"解决。C++有个特定的关键字用来声明采用C binding的函数:extern "C" 。用 extern "C"声明的函数将使用函数名作符号名,就像C函数一样。因此,只有非成员函数才能被声明为extern "C",并且不能被重载。尽管限制多多,extern "C"函数还是非常有用,因为它们可以象C函数一样被dlopen动态加载。冠以extern "C"限定符后,并不意味着函数中无法使用C++代码了,相反,它仍然是一个完全的C++函数,可以使用任何C++特性和各种类型的参数。
另外如何从C++动态库中获取类,附上几篇相关文章,但我并不建议这么做:
l  《LoadLibrary调用DLL中的Class》:http://www.cppblog.com/codejie/archive/2009/09/24/97141.html
“显式”使用C++动态库中的Class是非常繁琐和危险的事情,因此能用“隐式”就不要用“显式”,能静态就不要用动态。

附件:Linux下库相关命令

g++(gcc)编译选项

  -shared :指定生成动态链接库。
  -static :指定生成静态链接库。
  -fPIC :表示编译为位置独立的代码,用于编译共享库。目标文件需要创建成位置无关码,念上就是在可执行程序装载它们的时候,它们可以放在可执行程序的内存里的任何地方。
  -L. :表示要连接的库所在的目录。
  -l:指定链接时需要的动态库。编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.a/.so来确定库的名称。
  -Wall :生成所有警告信息。
  -ggdb :此选项将尽可能的生成gdb 的可以使用的调试信息。
  -g :编译器在编译的时候产生调试信息。
  -c :只激活预处理、编译和汇编,也就是把程序做成目标文件(.o文件) 。
  -Wl,options :把参数(options)传递给链接器ld 。如果options 中间有逗号,就将options分成多个选项,然后传递给链接程序。

nm命令

有时候可能需要查看一个库中到底有哪些函数,nm命令可以打印出库中的涉及到的所有符号。库既可以是静态的也可以是动态的。nm列出的符号有很多,常见的有三种:
  一种是在库中被调用,但并没有在库中定义(表明需要其他库支持),用U表示;
  一种是库中定义的函数,用T表示,这是最常见的;
  一种是所谓的弱态”符号,它们虽然在库中被定义,但是可能被其他库中的同名符号覆盖,用W表示。
$nm libhello.h

ldd命令

    ldd命令可以查看一个可执行程序依赖的共享库,例如我们编写的测试动态库依赖下面这些库:
        aaarticlea/png;base64,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" alt="" width="720" />
 
 

Linux系统上java调用C++ so库文件的更多相关文章

  1. Linux系统中如何添加自己的库文件路径

    库文件在连接(静态库和共享库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的.一般 Linux 系统把 /lib 和 /usr/lib 两个目录作为默认的库搜索路径,所以使用 ...

  2. linux系统上安装java

    linux系统上安装java   如何在ubuntu server上安装java(jre或jdk),主要注意以下几点: 1.下载你想要的java版本压缩包. JRE下载:http://java.com ...

  3. [翻译]现代Linux系统上的栈溢出攻击【转】

    转自:http://www.codeweblog.com/%E7%BF%BB%E8%AF%91-%E7%8E%B0%E4%BB%A3linux%E7%B3%BB%E7%BB%9F%E4%B8%8A%E ...

  4. VM下的linux系统上不了网?? 使用putty远程登录不上linux的解决方法?

    背景:昨晚想尝试一下用putty远程登录我的linux系统,悲剧的是,我竟然连接不上,显示 connection refused   ,连接被拒绝.于是我就想看看能不能在linux下看看能不能访问百度 ...

  5. Linux系统上使用php获取apk信息

    最近在做一个apk商城,需要在用户上传了apk之后系统自动读取apk信息(包名,版本号等),后台语言使用的是php,需要php去调用系统的aapt命令去读取apk信息,在Linux系统上安装aapt的 ...

  6. 在Linux系统上利用Tomcat搭建测试环境

    第一歩:查看Linux系统的IP地址. 输入命令:ifconfig 第二歩:WinSCP工具 1.下载WinSCP工具,便于文件直接从windows系统直接拖动到Linux系统中,图形化创建文件夹等. ...

  7. 使用VS2017 编写Linux系统上的Opencv程序

    背景 之前写图像算法的程序都是在window10下使用VS编写,VS这个IDE结合“ImageWatch.vsix“插件,用于调试opencv相关的图像算法程序十分方便.后因项目需要,需将相关程序移植 ...

  8. Redhat Linux 系统上安装JDK 1.7

    作者:潇湘隐者 出处:http://www.cnblogs.com/kerrycode/ 步骤1:下载JDK 1.7 安装包  JDK 1.7 下载地址:http://www.oracle.com/t ...

  9. Linux系统搭建Java环境【JDK、Tomcat、MySQL】一篇就够

      前言:所有项目在完成开发后都会部署上线的,一般都是用Linux系统作为服务器的,很少使用Windows Server(大多数项目的开发都是在Windows桌面系统完成的),一般有专门负责上线的人员 ...

随机推荐

  1. apache 设置允许跨域

    1.首先找到 httpd.conf 文件 找到   #LoadModule headers_module modules/mod_headers.so 把#注释符去掉(也有可能已经默认去掉了) 目的是 ...

  2. 第一次实验报告&学习总结

    实验报告一&学习总结 一.实验目的 熟悉JDK开发环境 熟练掌握结构化程序设计方法 二.实验内容 打印输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其中各位数字立方和等于该数本身.例 ...

  3. hashmap C++实现

    hashmap.h #ifndef _HASHMAP_H_ #define _HASHMAP_H_ template<class Key, class Value> class HashN ...

  4. SQL语句规范

    SQLStructure Query Language,结构化查询语言 1.规范(1)mysql对于SQL语句不区分大小写,SQL语句关键字尽量大写 show databases;show DataB ...

  5. [转帖]$PWD 和 $(pwd)

    $PWD 和 $(pwd) https://blog.csdn.net/shaojwa/article/details/51894980 细节决定成败.   注意两个效果一样,但是注意大小写,PWD是 ...

  6. Storm本地启动拓扑报错:Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/storm/topology/IRichSpout

    问题描述: Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/storm/topology ...

  7. Test:河北金力集团企业网集成

    三.网站建设部分(40分) 河北金力集团公文流转系统 1.项目需求: 河北金力集团是我省机械加工的龙头企业,主要从事矿山机械制造及各种机械零部件加工.企业有3个厂区,主厂区位于省高新技术开发区,3个分 ...

  8. 友善的树形DP

    一棵树,如果有序点对(x,y)之间路径的长度取模于3==0,那么ans0便加上这个长度: 如果取模于3==1,那么ans1便加上这个长度: 如果取模于3==2,那么ans2便加上这个长度: 让你求an ...

  9. USBIP源码分析

    简介 在普通的电脑上,想使用USB设备,必须将插入到主机.USBIP却可以通过网络,让主机访问其他主机上的外部设备,而用户程序完全感知不到区别. usbip的文章在这里:https://pdfs.se ...

  10. 用css、如何让图片自动适应屏幕大小,不出现滚动条,不变形,兼容各个浏览器?急!!!

    如果是个背景图的话,定义一个div,高100%,宽100%,里面放个img<div class='bg'> <img src="images/bg.jpg" al ...