Я работаю над приложением Android для x86, которое требует некоторой интеграции с C. Я использовал swig / JNI, чтобы сделать трюк, и в большинстве случаев все шло гладко. Однако указатели дают мне некоторые ошибки.
Моя проблема в том, что я могу успешно ссылаться на переменные адреса в эмуляторе (ARM), но на устройстве (x86) дела идут не так хорошо.
Используя пример из этой ссылки , я обнаружил, что адрес любой выделенной переменной в C становится NULL, как только этот адрес переходит к Java. Например ...
Сгенерированный Swig JNI:
SWIGEXPORT jlong JNICALL Java_exampleJNI_new_1intp(JNIEnv *jenv, jclass jcls) {
jlong jresult = 0 ;
int *result = 0 ;
(void)jenv;
(void)jcls;
result = (int *)new_intp();
LOGI("Result is %x", result);
*(int **)&jresult = result;
LOGI("JResult is %x", jresult);
return jresult;
}
Исходный файл, содержащий new_intp ():
static int *new_intp() {
return (int *) calloc(1,sizeof(int));
}
У меня есть операторы print, проверяющие значение адреса в том виде, как оно исходит из C и переходит на Java. В new_intp () новой переменной присваивается красивый адрес, но как только это значение возвращается в JNI и преобразуется в jlong, оно превращается в NULL.
Другими словами, *(int **)&jresult = result;
приводит к тому, что jresult равен 0.
Почему это происходит? Есть ли какая-то особенность x86, которая запрещает JNI работать с указателями? Или потому, что я тестирую его на физическом устройстве, а не на эмуляторе?
Привет