これは、 C++ から Java への ByteBuffer リターンを使用する方法という質問のフォローアップです。これまでのところ、Flexo の絶え間ないサポートに感謝します。まだタイプマップに慣れていないだけだと思います... :-(
次のように 4 つの引数を持つ C 関数があります。3 番目と 4 番目の引数は参照によって渡されます。
extern "C" int foo(const char* passByValText, const int passbyValLen,
unsigned char* retTextByRef, int *retTextLen)
Calling Java Wrapper 関数は、次のようにする必要があります。
int foo(String passByValText, int passbyValLen, byte[] retBuf, SWIGTYPE_p_int retTextLen);
あるいは、それは可能性があります
int foo(String passByValText, int passbyValLen, ByteBuffer retBuf, SWIGTYPE_p_int retTextLen);
私が書いたタイプマップの謝罪を共有することができます - しかし基本的にそれは問題をさらに混乱させるかもしれません..だから私はこれを白紙の状態に保ちます..
以下はc側のサンプルコードです
extern "C" int foo (const char* passByValText, const int passbyValLen, char *retTextByRef, int *retTextLen){
// binary value stuffed in the retTextByRef. In real program I compute this
unsigned char someText[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x00};
memcpy(cipherText,someText,9);
// I set the length of the value I stuffed into the buffer in c program
*cipherLen=9;
return 0;
}
そして、この c 関数を呼び出す Java プログラム
class Caller{
public static void main(String[] args) {
//Define the parameter to pass by reference!!
SWIGTYPE_p_int retTextLen=MYMODULE.new_intp();
//Create a Java Wrapper Instance
JavaWrapClass myWrap=new JavaWrapClass();
StringBuffer sBuf = new StringBuffer(50);
int retTextLenVal=0;
myWrap.foo("PASSED-STRING-BY-VALUE", 24, sBuf, retTextLen);
retTextLenVal= MYMODULE.intp_value(retTextLen);
System.out.println("JAVA :: got length "+ retTextLenVal);
System.out.println("JAVA :: got BUFFER "+ sBuf);
}
}
ありがとうございます!