Próbuję zawinąć stary kod do użycia w Javie i byłem bardzo szczęśliwy widząc, że Swig był w stanie obsłużyć plik nagłówkowy i wygenerował świetne opakowanie, które prawie działa. Teraz szukam głębokiej magii, która sprawi, że zadziała.Jak sprawić, by Swig poprawnie opakował bufor char *, który został zmodyfikowany w C jako Java Coś-lub-coś innego?
W C Mam funkcji, który wygląda tak
DLL_IMPORT int DustyVoodoo(char *buff, int len, char *curse);
Ta całkowita zwracana przez tę funkcję jest kod błędu w przypadku, gdy nie powiedzie się. Argumenty są
buff
jest bufor charakterlen
jest długość danych w buforzecurse
bufor inny znak, który zawiera wynik wywołania DustyVoodoo
Więc, możesz zobaczyć, gdzie to się dzieje, wynik wraca przez trzeci argument. Również len
jest mylące, ponieważ może być długością obu buforów, są one zawsze przydzielane jako te same wielkości w kodzie wywołującym, ale biorąc pod uwagę to, co DustyVoodoo
, nie uważam, że muszą być takie same. Aby być bezpiecznym, oba bufory powinny mieć taki sam rozmiar, na przykład 512 znaków.
Kod C generowane przez wiązanie się następująco:
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;
}
Prawdą jest za to, co robi; brakuje jednak faktu, że cursed
to nie tylko dane wejściowe, jest ono zmieniane przez funkcję i powinno być zwracane jako dane wyjściowe. Nie wie również, że łańcuchy java są naprawdę buforami i powinny być wspierane przez tablicę o odpowiedniej wielkości.
Myślę, że Swig może zrobić to, co właściwe, nie mogę po prostu dowiedzieć się z dokumentacji, jak powiedzieć Swigowi, co powinien wiedzieć. Jakieś mezmy w domu?
Po prostu na marginesie, sam googlę i był tak szczęśliwy, że zobaczyłem artykuł przepełnienia stosu, który brzmiał dokładnie tak, jakbym potrzebował. To było moje własne, ale bez odpowiedzi pytanie. 30 minut do początku strony, nieźle. – Ukko
30 minut? Zwykle jest to szybsze;) – Thomas