我想使用Swig从C ++附加到Java字节[]。诀窍是在不调用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数组无法增长。一旦创建,它们的大小将被锁定。唯一的选择是创建一个新的字节数组并返回该字节数组(并编写最终以任何代码形式调用的代码,而不仅是传递字节数组,还将用任何内容替换其自身的变量您返回;如果不这样做,您将无能为力。]