我想将一个简单的java数组传递给c。
目前,我使用以下.i文件。
%module example
%include "arrays_java.i"
%include "example.h"
%{
#include "example.h"
%}
使用arrays_java.i标头接受了java数组。 但它制作了数组的完整副本,这对我来说很慢。 我尝试用这些构建一个类型映射,我可以使用GetDoubleArray函数来获取java数组的指针。 在我使用swig之前,我使用JNI GetDoubleArrayElements构建自己的包装器,这要快得多。
下面你可以看到我尝试在类型图中使用Jni函数。
%typemap(jtype) (double *values, int lenght) "double[]"
%typemap(jstype) (double *values, int lenght) "double[]"
%typemap(javain) (double *values, int lenght) "$javainput"
%typemap(jni) (double *values, int lenght) "jdoubleArray"
%typemap(in) (double *values, int lenght) {
$1 = (double *)JCALL2(GetDoubleArrayElements, jenv, $input, NULL);
$2 = (int) JCALL1(GetArrayLength, jenv, $input);
}
%apply (double * DOUBLE, int LENGTH) { (double * doubleArray, long len) };
但swig只构建了一个我应该使用的javaclass(SWIGTYPE_p_double)。 我只想传递一个简单的java数组并在c。
中使用这个java数组指针 希望你能帮助我。编辑:
在这里,您可以看到我的完整.i文件。我纠正了长度失败。同样的问题
%module exampleModule
%include "std_string.i"
%include "std_vector.i"
%include "arrays_java.i"
#include <string>
#include <vector>
%template(nativeDoubleVector) std::vector<double>;
%typemap(jtype) (double *values, int length) "double[]"
%typemap(jstype) (double *values, int length) "double[]"
%typemap(javain) (double *values, int length) "$javainput"
%typemap(jni) (double *values, int length) "jdoubleArray"
%typemap(in) (double *values, int length) {
$1 = (double *)JCALL2(GetDoubleArrayElements, jenv, $input, NULL);
$2 = (int) JCALL1(GetArrayLength, jenv, $input);
}
%apply (double * values, int length) { (double * doubleArray, long len) };
/* Let's just grab the original header file here */
%include "example.h"
%{
#include "example"
%}
和.h文件
class example
{
public:
example(int width, int height);
~example();
test(double *values, int length);
};
我能看到-Wall输出吗?我试了一下,但我在android studio终端中没有输出
答案 0 :(得分:0)
我得到了上半年的解决方案。
//java float[] in c float arr
%typemap(jstype) double[] "double[]"
%typemap(jtype) double[] "double[]"
%typemap(jni) double[] "jdoubleArray"
%typemap(javain) double[] "$javainput"
%typemap(in) double[] {
$1 = JCALL2(GetDoubleArrayElements, jenv, $input, NULL);
}
这段代码允许我使用没有副本的java数组。 但是我无法改变c侧的值,而java方面也知道它。 Java方面有旧的价值。
我知道错。在wrap.cpp中,缺少函数ReleasDoubleArrayElements。 当我将它插入wrap.cpp时,一切都很好。下面你可以看到swig生成的wrap.cpp。
SWIGEXPORT void JNICALL Java_com_example_glm_ndk_1swig_1example_exampleJNI_Circle_1testfunktion(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jfloatArray jarg2, jint jarg3) {
Circle *arg1 = (Circle *) 0 ;
float *arg2 ;
int arg3 ;
(void)jenv;
(void)jcls;
(void)jarg1_;
arg1 = *(Circle **)&jarg1;
{
arg2 = jenv->GetFloatArrayElements(jarg2, NULL);
}
arg3 = (int)jarg3;
(arg1)->testfunktion(arg2,arg3);
jenv->ReleaseFloatArrayElements(jarg2, arg2, NULL);//insert manually
}
但是我必须告诉swig插入此功能?
编辑:
我得到了解决方案。谢谢Flexo。你用另一个线程帮助了我。 python arg out 我必须使用%typemap(argout)。在下面你可以看到我的解决方案适合我。
%typemap(jstype) double[] "double[]"
%typemap(jtype) double[] "double[]"
%typemap(jni) double[] "jdoubleArray"
%typemap(javain) double[] "$javainput"
%typemap(in) double[] {
$1 = JCALL2(GetDoubleArrayElements, jenv, $input, NULL);
}
%typemap(argout) double[]{
JCALL3(ReleaseDoubleArrayElements,jenv, $input, $1, 0);
}
比将数组复制到c要快得多。