我想使用Swig从C ++附加到Java byte []。诀窍是在不调用GetByteArrayElements的情况下执行此操作,因为如果无法固定byte [],这将复制byte []。

无需大惊小怪,我们可以轻松地使用SetByteArrayRegion做到这一点-直接将字节数写入byte []。
痛饮的问题是:


实际工作的代码在.cpp中-例如,读取文件的内容并将其放入字符串fileContents中。 C ++代码无权访问jni字段。
执行SetByteArrayRegion的代码在.i文件中-它无权访问c ++函数生成的fileContents数据。


我找不到使用swig将c ++函数生成的数据附加到byte []中的任何示例,而无需固定整个缓冲区并仅使用SetByteArrayRegion复制所需的数据。

示例C ++功能实现:


    void append(char *s, int pos) {
      char* fileContents = readFromFile();
      strcat(s+pos, fileContents);
    }


可能的解决方法:

在.i文件中,我们执行实际的实现(调用readFromFile),并使用这些结果直接在%template中调用SetByteArrayRegion。这很hacky。

最佳答案

Java数组无法增长。一旦生成,它们的大小将被锁定。唯一的选择是创建一个新的字节数组并返回该字节数组(并编写最终以任何代码形式调用的代码,而不仅是传递字节数组,而且还将用任何内容替换其自身的变量您会返回;如果不这样做,您将无能为力。

关于java - 使用swig附加到字节数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60020952/

10-11 20:10