当前位置: 首页 > 面试题库 >

如何使用Swig定义和传递ByteBuffer?

杜俊风
2023-03-14
问题内容

我需要从Java调用C函数。该函数具有以下API:

void convert(char* pchInput, int inputSize, int convertValue, char* pchOutput, int* outputSize);

我正在用Swig做包装纸。

我读了这篇文章: ByteBuffer.allocate()vs.ByteBuffer.allocateDirect()

最好将结果创建(pchOutput)DirectByteBuffer

  1. 如何将传递Bytebuffer给代码c(使用swig)
  2. C代码如何从ByteBuffer读取和写入数据?

谢谢


问题答案:

来自http://swig.10945.n7.nabble.com/Re-How-to-specify-access-to-a-java-nio-
ByteBuffer-td6696.html
的一些经过修改的示例,应在进行较小的更改(特别是在%typemap(in) (char* pchOutput, int* outputSize))因为我没有编译它,所以只需运行swig来检查Java端是否正确生成。

%typemap(in)        (char* pchInput, int inputSize) {
  $1 = JCALL1(GetDirectBufferAddress, jenv, $input); 
  $2 = (int)JCALL1(GetDirectBufferCapacity, jenv, $input); 
} 
%typemap(in)        (char* pchOutput, int* outputSize) {
  $1 = JCALL1(GetDirectBufferAddress, jenv, $input); 
  $2 = &((int)JCALL1(GetDirectBufferCapacity, jenv, $input)); 
}

/* These 3 typemaps tell SWIG what JNI and Java types to use */ 
%typemap(jni)       (char* pchInput, int inputSize), (char* pchOutput, int* outputSize) "jobject" 
%typemap(jtype)     (char* pchInput, int inputSize), (char* pchOutput, int* outputSize) "java.nio.ByteBuffer" 
%typemap(jstype)    (char* pchInput, int inputSize), (char* pchOutput, int* outputSize) "java.nio.ByteBuffer" 
%typemap(javain)    (char* pchInput, int inputSize), (char* pchOutput, int* outputSize) "$javainput" 
%typemap(javaout)   (char* pchInput, int inputSize), (char* pchOutput, int* outputSize) { 
    return $jnicall; 
}


 类似资料:
  • 问题内容: 我在C 中有一个方法,该方法将双精度数组作为参数。我从Java调用此方法,需要传递一个双精度数组。C 例程读取和修改数组的值,而我需要Java中的那些更新后的值。我该怎么做呢? 例如,使用C ++例程: 和Java代码: 我猜不能像上面的调用那样对myMethod进行调用…还是可以吗?而在Swig中进行这项工作所需的是什么。如果我无法进行上述调用,如何将我的值获取到C ++代码? 问题

  • 问题内容: 我正在使用SWIG从Java访问C ++代码。 公开非常量引用传递的std :: string参数的最简单方法是什么? 我有参考暴露为Java数组传递原语,感谢typemaps.i,和s ^暴露,感谢std_string.i。但是非const std :: string&被公开为不透明指针类型。 当前: 期望的: 更新 :我找到 了 解决方案,如下所述。但是,它花费了超过几秒钟的时间。

  • 我在C中有一个函数,我需要在Java中创建一个包装器。该函数期望FILE类型的输入参数(来自标准输入输出)。我不相信Swig可以在Java中自动适应一个接口,而不需要在Swig接口文件中进行一些手动工程-我可能错了。 这是我所拥有的 C(标题h): 我尝试过编译,但结果是创建了Swig指针类型:SWIGTYPE_p_FILE,这无助于我将FILE type参数从Java传递到C。

  • 问题内容: 我正在尝试将自己的自定义对象传递到包中: 我得到错误: 问题答案: 一种方法是让您的自定义对象实现Parcelable接口并使用

  • 我编写了这个函数,它只是用子字符串替换数据表列中的每个值: 但每次我试着运行它时,我都会发现错误: 现在我已经做了很多关于为什么它不起作用的研究,但我不明白。我读过一些关于标准评估和懒散的东西,但我尝试的似乎都不管用。有什么帮助吗? 谢谢

  • 问题内容: 会做到的。我试图将用户定义的参数传递给scrapy的Spider。谁能建议该怎么做? 我在某处读到一个参数,但不知道如何使用它。 问题答案: Spider参数使用选项在命令中传递。例如: Spider程序可以将参数作为属性访问: 摘自Scrapy文档:http ://doc.scrapy.org/en/latest/topics/spiders.html#spider-argument