java intbyreference_PointerByReference没有返回值

我试图通过JNA从Java调用C++函数。我想传入一个字符串,并返回一个字符串。这是通过使用in参数和out参数完成的。我使用PointerByReference来表示char**输出参数。对C++的调用有效,但PointerByReference在调用后为空。

我将我的代码放在PointerByReference文档上。任何想法我做错了什么?

我已经将打印语句添加到C++中,以确保它不会将指针设置为null,而且绝对不是。所以我使用JNA的一些人一定是错的。但是什么?

C++代码

void processRequest(char* input, char** output, int* outputLength)

{

// Variable output size from processInput

std::string sOutput = processInput(input);

char* results = new char[sOutput.length() + 1];

strncpy(results, sOutput.c_str(), sOutput.length());

results[sOutput.length()] = '\0';

output = &results;

outputLength = new int(strlen(results) + 1);

}Java代码

这被java调用如下所示:

public class RunRequestT1 {

private static final Logger log = LoggerFactory.getLogger(MyLibWrapperImpl.class);

static boolean envVarsSetupDone = false;

static interface MyLib extends Library {

MyLib INSTANCE = (MyLib) Native.loadLibrary("N:\\sys1\\sys1_dist\\MyLib\\MyLib9.8.Q.P3.G15.T\\bin\\MyLib.dll", MyLib.class);

public void processRequest(String request, PointerByReference bufp, IntByReference lenp);

public void clearMemoryPtr(PointerByReference bufp, IntByReference lenp);

}

public static void main(String[] args) throws IOException {

System.out.println("sys1: Reading request");

String request = FileUtils.readFileToString(new File("C:\\dev\\prj\\single-request.xml"), "UTF-8");

System.out.println("sys1: Pricing request");

String response = processRequest(request);

System.out.println(response);

}

public static String processRequest(String request) {

System.out.println("sys1: prepare args");

// code based on https://github.com/twall/jna/blob/master/www/ByRefArguments.md

PointerByReference bufp = new PointerByReference();

IntByReference lenp = new IntByReference();

System.out.println("sys1: making call");

MyLib.INSTANCE.processRequest(request, bufp, lenp);

System.out.println("reading response");

System.out.println("bufp: " + bufp.getValue());

System.out.println("lenp: " + lenp.getValue());

Pointer p = bufp.getValue();

byte[] buffer = p.getByteArray(0, lenp.getValue());

String response = Native.toString(buffer);

//String response = p.getString(0);

// de-allocate memory buffer

System.out.println("cleaning memory");

MyLib.INSTANCE.clearMemoryPtr(bufp, lenp);

return response;

}

}标准输出

当我打电话给我时,我得到如下结果:

sys1: Reading request

sys1: Pricing request

sys1: prepare args

sys1: making call

reading response

bufp: null

lenp: 0

Exception in thread "main" java.lang.NullPointerException

at com.calyon.gcm.MyLibwrapper.main.RunRequestT1.priceRequest()

at com.calyon.gcm.MyLibwrapper.main.RunRequestT1.main()我尽量保持最小限度,而且确实没有太多事情要做。

我已经测试了JNA版本3.4和3.5

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值