首页 行业资讯 宠物日常 宠物养护 宠物健康 宠物故事

JAVA中怎么处理指针参数

发布网友 发布时间:2022-04-23 08:12

我来回答

2个回答

热心网友 时间:2022-06-18 05:01

用JNI技术,就是把那个函数再经过Java JNI规范包裹一下,让Java可以调用包裹的函数。
比如:
/* C++ */ void foo(void* address) { printf("%ld", address); }
要调用这样的函数
/* C++ */ jobject com_test_Klass_foo(jobject arr) { foo(convertToVoidP(arr)); }
把这个函数编译成Windows DLL或者Linux so:
在Java里:
/* Java */ package com.test; class Klass { public native foo(ArrayList<?> arr); static {System.loadLibrary('dll/or/so/path');}}追问我已经生成了这个函数的动态链接库,放在C盘的windows/system32中了,在JAVA中声明时,也就是你写的这些代码中/* Java */ package com.test; class Klass { public native foo(ArrayList arr); 的ArrayList arr这个应该是我们说的要传递的那个指针参数吧,这里具体应该怎么写啊

追答Java里不用指针,传递到native函数里,用不上指针。
比如一个C函数: void changeValue(long *var) {*var = 1000;}
那么包裹时就应该:
long *tmp = (long*)malloc(sizeof(long)); changeValue(tmp); setValueToJavaObject(sth_java_object, *tmp);

如果要联系起来:void changeValue(long *var) { *var += 1000; }
那么包裹时应该:
long tmp = readFromJavaObject(sth_java_object);
changeValue(&tmp);
setValueToJavaObject(sth_java_object, *tmp);

如果是要运行一个函数指针:void agentExec(long (*func)()) { func(); }
那么包裹时必须有一个函数转化:
static jobject obj;
long foobar() {
...
if(!obj) {/* catch error */}
method = getJavaObjectMethod(obj);
long r = callMethod(obj, method, args);
...
return r;
}

jobject com_test_Klass_foo(...) { obj = ...; agentExec(foobar); ... }
native方法不明显地传递任何指针

热心网友 时间:2022-06-18 05:01

java中有个引用也是操作地址的,还有就是你如果传数组、链表、类……这些都是传递的地址过去,你看看那个能满足你的要求把

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com