需要再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
}
}