Swig:将unsigned char数组从C ++传递给Java

时间:2014-04-14 16:49:46

标签: java c++ bytearray swig

我在.cpp文件中有一个C ++函数;说unsigned char *myFunc()。 如何在Java中的byte[]数组中转换该数组? 我的意思是,在Java中,我想做类似的事情:

byte[] b = myLib.myFunc();

我正在使用SWIG并且显然我需要在unsigned char文件中定义从byte.i的转换类型,但我并不确切知道如何。< / p>

提前谢谢

2 个答案:

答案 0 :(得分:1)

尝试在.i文件中返回std::string而不是unsigned char*%include <std_string.i>。感谢std_string.i字体地图,您最终可能会在接收方获得byte[]。如果您可以更改myFunc的返回类型,请通过%inline创建一个包装器,类似

%inline %{
    std::string myFuncStr() { return myFunc(); }
%}

如果您希望自己可以%rename myFuncStrmyFunc,从而隐藏了导出到Java的myFunc实际上是真实myFunc包装的事实}。

如果这不起作用,Flexo对Swig: convert return type std::string(binary) to java byte[]的解决方案很可能会解决。

答案 1 :(得分:0)

我不知道如何使用swig,但我知道如果你改变主意并且不想使用JNI,那么以下内容将有效:

在C ++方面:

extern "C" jbyteArray JNIEXPORT Java_myPackageName_MyClassName_getByteArray(JNIEnv* env, jobject obj)
{
    jbyteArray byte_arr = env->NewByteArray(size);

    jbyte bytes[25];  //Some byte array you want to give to java. Could be an unsigned char[25].

    for (int i = 65; i < 90; ++i) //filling it with some A-Z ASCII characters.
    {
        bytes[i - 65] = i;
    }

    env->SetIntArrayRegion(byte_arr, 0, 25, &bytes[0]); //Fill our byte array

    return byte_arr; //return the byte array..
}

在Java方面:

package myPackageName;

class MyClassName
{
    static {
        System.loadLibrary("myByteArrayModule");
    }

    public static native byte[] getByteArray();
}