刚来到公司,屁股还没坐稳,老板把我叫到办公室,就让我做一个小程序。我瞬间懵逼了。对小程序一窍不通,还好通过学习小程序视频,两天的时间就做了一个云开发的小程序,但是领导不想核心的代码被别人看到,给了我一个dll文件。找了大量的资料,还是用Java做吧,于是又快速的用Java搭建了一个后台,测试了一下,发现dll调用成功了,但是在发布到服务器上的时候,dll文件又不行了,又找方法。发现so文件和dll文件一样,都是打包生成的动态链接库,于是就在服务器上测试调用so文件,在调用so文件的时候出现了很多的问题,例如so文件生成失败、调用so文件找不到里面的方法、返回值出现乱码等。

一、生成so文件(Limux下操作)

  1.把.h文件和.cpp文件放到一起(随意了想咋放都行 执行命令的时候地址写对就好)

    test.h文件只写.cpp文件里面的方法名

void Test01();

      test.cpp文件

#include <stdio.h>
#include "test.h" void Test01()
{
printf("TestA func\n");
}

  

生成so文件的命令(在文件的路径下执行)

g++ test.cpp -fPIC -shared -o libtest.so

  so文件以lib开头(lib**.so)

这种方式生成的so文件有时在Java后端调用的时候报找不到指定方法的错误。然后找了好久找到一个方法给我解决了这个问题(看第二种生成so文件的方式)。(如果这个方法你们不适用,那就另找解决方式吧)

2.不要.h文件了直接用.cpp文件

 #include <stdio.h>
#include "test.h" extern "C" void Test01()
{
printf("TestA func\n");
}

方法的前面以 extern "C" 开头,用这种方式对方法进行声明。

2.通过Java的jna包调用so文件进行传参(直接上代码)

public interface CLibrary extends Library {

            // DLL文件默认路径为项目根目录,若DLL文件存放在项目外,请使用绝对路径。(此处:(Platform.isWindows()?"msvcrt":"c")指本地动态库msvcrt.dll)
CLibrary INSTANCE = (CLibrary) Native.loadLibrary(("/usr/lib/libtest.so"),
CLibrary.class); // 声明将要调用的so中的方法,可以是多个方法(此处示例调用so动态库libtest.so中的Test01()方法)
void Test01(String str, int num); }
 public static void main(String[] args) {
String cou = CLibrary.INSTANCE.Test01("hi",);
System.out.println(cou); }

3.又是调用so文件返回值是字符串的时候会出现乱码(解决方法如下)

通过用Pointer来获取返回值,而so链接库的返回值要存到指针里面

Java代码:

public interface CLibrary extends Library {

            // DLL文件默认路径为项目根目录,若DLL文件存放在项目外,请使用绝对路径。(此处:(Platform.isWindows()?"msvcrt":"c")指本地动态库msvcrt.dll)
CLibrary INSTANCE = (CLibrary) Native.loadLibrary(("/usr/lib/libtest.so"),
CLibrary.class); // 声明将要调用的so中的方法,可以是多个方法(此处示例调用so动态库libtest.so中的Test01()方法)
void Test01(String str, int num,Pointer p); }
 public static void main(String[] args) {

         Pointer p = new Memory();
CLibrary.INSTANCE.Test01("hi", , p); for(int i=, sumi=; i< sumi; i++){ System.out.print((char) p.getByteArray(, )[i]); }
}

so链接库方法声明方式:

extern "C" void Test01(char* str, unsigned int num, char* strReturn){
*******************************
*****************
**********
return *****;
}

获取更多资源请访问:http://www.itcsdr.com/  或者请扫描右上角关注公众号:IT资源分享平台

Java调用动态链接库so文件(传参以及处理返回值问题)的更多相关文章

  1. C# 多线程编程,传参,接受返回值

    C# 多线程编程,传参,接受返回值 今天将多线程的知识有回顾了下,总结了几点: 新建一个线程(无参数,无返回值) Thread th = new Thread(new ThreadStart(Prin ...

  2. HttpClient调用doGet、doPost、JSON传参及获得返回值

    调用 doPost:map传参 Map<String,Object> map = new HashMap<>(); map.put("test"," ...

  3. C#打开php链接传参然后接收返回值

    php代码 一.php <?php header("Content-Type:text/html;charset=UTF-8"); $u=$_POST['zdupdate'] ...

  4. Java 调用 groovy 脚本文件,groovy 访问 MongoDB

    groovy 访问 MongoDB 示例: shell.groovy package db import com.gmongo.GMongoClient import com.mongodb.Basi ...

  5. Java调用第三方dll文件的使用方法 System.load()或System.loadLibrary()

    Java调用第三方dll文件的使用方法 public class OtherAdapter { static { //System.loadLibrary("Connector") ...

  6. java调用dll/so文件

    大家都知道用C++编写的程序如果用于windows使用则编译为xxx.dll文件,如果是Linux使用则编译为libxxx.so文件.下面将java调用dll/so文件的方法粘出来方便下次使用.此处使 ...

  7. Java加载jar文件并调用jar文件当中有参数和返回值的方法

    在工作当中经常遇到反编译后的jar文件,并要传入参数了解其中的某些方法的输出,想到Java里面的反射可以实现加载jar文件并调用其中的方法来达到自己的目的.就写了个Demo代码. 以下的类可以编译生成 ...

  8. java调用py文件传参执行

    java执行的也是py文件主函数. 传参: String url="*********************"; String[] args1 = new String[] { ...

  9. Java自学-类和对象 传参

    Java中的传参 变量有两种类型 基本类型 和类类型 参数也是变量,所以传参分为 基本类型传参 类类型传参 步骤 1 : 基本类型传参 基本类型传参 在方法内,无法修改方法外的基本类型参数 publi ...

随机推荐

  1. 分布式系统CAP定理与BASE理论

    CAP定理: 一个分布式系统不可能同时满足一致性(C:Consistency).可用性(A:Availability)和分区容错性(P:Partition tolerance)这三个基本要求,最多只能 ...

  2. 正睿2019省选附加赛 Day10 (这篇其实已经都咕咕了...)

    目录 2019.3.13 A.算算算(二项式定理 斯特林数) B.买买买 C.树树树 2019.3.13 比赛链接 A.算算算(二项式定理 斯特林数) 题目链接 \(x^k\)可以用二项式定理展开,需 ...

  3. 计蒜客 41387.XKC's basketball team-线段树(区间查找大于等于x的最靠右的位置) (The Preliminary Contest for ICPC Asia Xuzhou 2019 E.) 2019年徐州网络赛

    XKC's basketball team XKC , the captain of the basketball team , is directing a train of nn team mem ...

  4. SIT系统整合测试

    System Integrate Test的缩写,即系统整合测试      系统整合测试就是评估产品在其规格范围内的环境下工作,能否完成产品设计规格所需要的功能及与周边设备.应用软件的兼容性.大致可以 ...

  5. 【AtCoder】 ARC 101

    link 搬来了曾经的题解 C-Candles 题意:数轴上有一些点,从原点开始移动到达这些点中的任意\(K\)个所需要的最短总路程 \(K\)个点必然是一个区间,枚举最左边的就行了 #include ...

  6. 解决wordpress修改固定链接后出现404错误不能访问文章的方法

    首先,建议大家安装完wordpress网站程序之后第一时间设置一下固定链接,避免以后修改出错.在wp后台仪表盘左侧导航里找到“设置——固定链接”即可配置你的wordpress固定链接,通常我习惯使用的 ...

  7. Excel填坑[0]

    Excel填坑[0] 本着一天水一贴的原则(放p),我又来填坑了.今天做一个很简单的排队图,虽然不难,但因为手机显示问题折腾了半天.感觉做图做表格不仅仅是靠技术,更重要的是思维. 就是这张图,看起来平 ...

  8. 关于用maven创建的springboot工程打包jar后找不到配置文件的问题

    你的resources文件夹的名称写错了!!! 如果不在pom中配置build的资源路径,那么你的资源文件名必须默认是“resources”! 解决办法有两个: 1.修改文件夹名称 2.添加pom的b ...

  9. mstar 平台I2C 配置

    芯片的pin 脚可以用作不同的功能,总结一句就是外设进行状态和数据交换. 最常用的是作为GPIO,设置为输出模式时,通过高低电平来控制一些外围设置:// 如LED,屏的电源,背光的开关,功放的静音等等 ...

  10. How to Use Convolutional Neural Networks for Time Series Classification

    How to Use Convolutional Neural Networks for Time Series Classification 2019-10-08 12:09:35 This blo ...