Swig,将 c 指针转换为 float[]

Posted

技术标签:

【中文标题】Swig,将 c 指针转换为 float[]【英文标题】:Swig, convert c pointer to float[] 【发布时间】:2014-09-30 21:14:55 【问题描述】:

我痛饮如何将 c 中的返回值转换为 java 中的 float[]

//C Function
inline float32* b2Body::GetWorldPoint(float32 localX, float32 localY)

    b2Vec2 val = b2Mul(m_xf, b2Vec2(localX, localY));
    fin[0] = val.x, val.y;
    fin[1] = val.y;
    return fin;

如您所见,该函数返回 float32*,它是一个二元素数组。在我的 swig 文件中,我包含了

%include cpointer.i
%include "arrays_java.i"
%apply float[] float32*;

但我得到了错误:

.cpp: In function '_jfloatArray* Java_com_google_fpl_liquidfun_liquidfunJNI_Body_1getWorldPoint_1_1SWIG_11(JNIEnv*, jclass, jlong, jobject, jfloat, jfloat)':
C:/Users/Garrett/Desktop/liquidfun-master/liquidfun//Box2D/swig/jni/../gen/cpp/armeabi-v7a/liquidfun_wrap.cpp:6147:59: error: 'FillMeInAsSizeCannotBeDeterminedAutomatically' was not declared in this scope
make.exe: *** [obj/local/armeabi-v7a/objs/liquidfun_jni/gen/cpp/armeabi-v7a/liquidfun_wrap.o] Error 1

【问题讨论】:

看起来它告诉你它需要知道返回对象的大小。 【参考方案1】:

这和an older question on the mailing list基本一样的解决方案:

%include cpointer.i
%include "arrays_java.i"
%typemap(out) float[] 
%$result = SWIG_JavaArrayOutFloat(jenv, (float *)$1, 2); %
%apply float[] float32*;

需要注意的是,正如所写,这将导致 SWIG 假定所有 float* 使用作为返回类型是一个大小为 2 的数组。

【讨论】:

以上是关于Swig,将 c 指针转换为 float[]的主要内容,如果未能解决你的问题,请参考以下文章

如何将int指针转换为浮点指针

将 C/C++ 向量快速转换为 Numpy 数组

C中的numpy数组类型转换

SWIG 将 unsigned char* 转换为 20 字节缓冲区 Java 结构

如何在带有 Swig 的 Python 中使用 float **?

如何使用 SWIG 将 C++ 数组转换为 Python 列表?