JAVA中怎么处理指针参数
在JAVA中要调用C++写的函数,但是这个函数的参数是用指针来传递的,谁能告诉我,这个问题JAVA中怎么解决啊,拜托拜托...
在JAVA中要调用C++写的函数,但是这个函数的参数是用指针来传递的,谁能告诉我,这个问题JAVA中怎么解决啊,拜托拜托
展开
2个回答
展开全部
用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++ */ 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方法不明显地传递任何指针
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询