Я пытаюсь обернуть некоторый унаследованный код для использования в 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, что ему нужно знать. Какие-нибудь мазеры в доме?