java通过 JNA调用 so

需要再linux系统中ldd  so文件------ 列出动态库依赖关系,看看glibc版本是否一致。

下面是java代码,其中c++的char*对应java中的byte[]。c++的方法返回值可以从中获取。另外java中用IntByReference对应c++中的int*。

https://www.jb51.net/os/RedHat/538539.html

看一下你那里的glibc的版本号

strings /lib64/libc.so.6 |grep GLIBC_

rpm -qa |grep glibc

查看libc.so.6指向的版本

ll /lib64/libc**

rm -rf /lib64/libc.so.6 // 先删除先前的libc.so.6软链

当libc.so.6被删除的时候可以用下面这个 临时用各种命令

LD_PRELOAD=/lib64/libc-2.12.so

ln -s /lib64/libc-2.12.so /lib64/libc.so.6

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.ptr.IntByReference;

public class HbaseRsJNA {
	public interface LgetLib extends Library {
		String path = Thread.currentThread().getContextClassLoader().getResource("resources/conf/so/libhbase_resultsets_handler.so").getPath();
//		String path = Thread.currentThread().getContextClassLoader().getResource("/libhbase_resultsets_handler").getPath();
		LgetLib INSTANCE = (LgetLib) Native.loadLibrary(path,LgetLib.class);
		boolean handle_hbase_resultsets(String toolName,String sqlStatement,byte[] bs,IntByReference resultsets_len);
	}
//	extern "C" bool handle_hbase_resultsets(const char* toolname, const char* sql, char* resultsets, int* resultsets_len);
//	https://blog.csdn.net/abc6368765/article/details/77842066 JNA实战笔记汇总<二> JNA和C/C++的数据类型转换
	//    /opt/glibc-2.18/lib
	public static String getHbaseRs(String toolName ,String sqlStatement,String hbResult) {
		byte[] bs = hbResult.getBytes();
		IntByReference resultsets_len=new IntByReference();
		resultsets_len.setValue(bs.length);
		System.out.println("掉so之前的长度为:"+bs.length);
		boolean flag = LgetLib.INSTANCE.handle_hbase_resultsets(toolName,sqlStatement,bs,resultsets_len);
		System.out.println(flag); 
		System.out.println("掉so之后的长度为:"+resultsets_len.getValue());
		int endIndex = resultsets_len.getValue();
		byte [] subbs = new byte[endIndex];
		System.arraycopy(bs, 0, subbs, 0, endIndex);
//		src:byte源数组
//		srcPos:截取源byte数组起始位置(0位置有效)
//		dest,:byte目的数组(截取后存放的数组)
//		destPos:截取后存放的数组起始位置(0位置有效)
//		length:截取的数据长度
		return new String(subbs).trim();
	}
	public static void main(String[] args) {
		 byte[] bs = "wangqiang".getBytes();
		 byte [] subbs = new byte[4];
		 System.arraycopy(bs, 0, subbs, 0, 4);
		 System.out.println(new String(subbs).trim());
	}
	
}

通过main函数吧项目打成jar调用so文件执行方法,注意将项目打成jar之后,需要将so文件存放在----echo $LD_LIBRARY_PATH查看LD_LIBRARY_PATH是Linux环境变量名,该环境变量主要用于指定查找共享库(动态链接库)时除了默认路径之外的其他路径。然后java -jar xxx.jar执行jar就ok了

public class HbaseRsJNA {
	
	public interface LgetLib extends Library {
//		String path = Thread.currentThread().getContextClassLoader().getResource("resources/conf/so/libhbase_resultsets_handler.so").getPath();
//		String path = Thread.currentThread().getContextClassLoader().getResource("/libhbase_resultsets_handler").getPath();
		LgetLib INSTANCE = (LgetLib) Native.loadLibrary("libhbase_resultsets_handler.so",LgetLib.class);
		//生成jar之后,echo $LD_LIBRARY_PATH查看LD_LIBRARY_PATH是Linux环境变量名,该环境变量主要用于指定查找共享库(动态链接库)时除了默认路径之外的其他路径。
//		然后将so文件放到改路径下面     ***服务器是/Analyzer/lib/
		boolean handle_hbase_resultsets(String toolName,String sqlStatement,byte[] bs,IntByReference resultsets_len);
	}
	public static String getHbaseRs(String toolName ,String sqlStatement,byte[] bs) {
		IntByReference resultsets_len=new IntByReference();
		resultsets_len.setValue(bs.length);
		System.out.println("掉so之前的长度为:"+bs.length);
		boolean flag = LgetLib.INSTANCE.handle_hbase_resultsets(toolName,sqlStatement,bs,resultsets_len);
		System.out.println(flag); 
		System.out.println("掉so之后的长度为:"+resultsets_len.getValue());
		int endIndex = resultsets_len.getValue();
		byte [] subbs = new byte[endIndex];
		System.arraycopy(bs, 0, subbs, 0, endIndex);
		return new String(subbs).trim();
	}
	public static void main(String[] args) throws IOException {
		File f= new File("/www/3_HBase_1543224351_200110.ss");
		InputStream input =  new FileInputStream(f);
		String hbRs = "";
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		byte[] buffer = new byte[1024];
		int len = 0;
		while ((len = input.read(buffer)) != -1) {
			baos.write(buffer, 0, len);
		}
		byte[] b = baos.toByteArray();
//		System.out.println("读取结果集的长度为:"+b.length);
		input.close();
		baos.close();
		System.out.println("调so之前 的结果集:"+new String(b));
		hbRs = HbaseRsJNA.getHbaseRs("protobuf", "Scan(hbase:meta)",b);
		System.out.println("调so之后 的结果集:"+hbRs);
		
//		http://blog.sina.com.cn/s/blog_8cfbb9920100zy7g.html
	
	}
	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值