我想将一些旧代码封装以便在Java中使用,我很高兴看到Swig可以处理头文件并生成一个几乎可以工作的良好封装。现在我正在寻找使其真正工作的深度魔法。
在C语言中,我有一个函数长这样:
DLL_IMPORT int DustyVoodoo(char *buff, int len, char *curse);
这个函数返回一个整数错误码以表示它是否失败。参数如下:
buff
是一个字符缓冲区len
是缓冲区中数据的长度curse
是另一个字符缓冲区,其中包含调用 DustyVoodoo 的结果
len
令人困惑,因为它可能是两个缓冲区的长度,但在调用代码中它们总是被分配为相同的大小,但考虑到 DustyVoodoo
的作用,它们不需要是相同的大小。为了安全起见,在实践中应该将两个缓冲区设置为相同的大小,比如512个字符。生成绑定的 C 代码如下:
SWIGEXPORT jint JNICALL Java_pemapiJNI_DustyVoodoo(JNIEnv *jenv, jclass jcls, jstring
jarg1, jint jarg2, jstring jarg3) {
jint jresult = 0 ;
char *arg1 = (char *) 0 ;
int arg2 ;
char *arg3 = (char *) 0 ;
int result;
(void)jenv;
(void)jcls;
arg1 = 0;
if (jarg1) {
arg1 = (char *)(*jenv)->GetStringUTFChars(jenv, jarg1, 0);
if (!arg1) return 0;
}
arg2 = (int)jarg2;
arg3 = 0;
if (jarg3) {
arg3 = (char *)(*jenv)->GetStringUTFChars(jenv, jarg3, 0);
if (!arg3) return 0;
}
result = (int)PemnEncrypt(arg1,arg2,arg3);
jresult = (jint)result;
if (arg1) (*jenv)->ReleaseStringUTFChars(jenv, jarg1, (const char *)arg1);
if (arg3) (*jenv)->ReleaseStringUTFChars(jenv, jarg3, (const char *)arg3);
return jresult;
}
它的功能是正确的;然而,它忽略了cursed不仅是一个输入,它被函数改变后应该作为输出返回。它也不知道Java字符串实际上是缓冲区,并且应该由适当大小的数组支持。
我认为Swig可以在这里做正确的事情,但我无法从文档中找出如何告诉Swig它需要知道的内容。有没有任何typemap大师在场?