Использование ссылки, переданной из другого файла cpp в нативный код, приводит к ошибке сегментации - PullRequest
0 голосов
/ 30 марта 2011

Я пробовал это: вызывая функцию (со ссылкой на параметр) из другого файла cpp, я не могу ничего присвоить параметру, переданному по ссылке.

в функции Java_com_example_afeTest_testReference в test.cpp

std::string a ="";
const std::string x = "jo";
std::string y = "yi", z = "ta";
testFunc(a,x,y, z);           // call test function which resides in same cpp no error

Теперь поместите эту функцию в test.cpp, она работает

std::string& testFunc(std::string& a, const std::string& x, std::string& y, std::string& z){
    a = x;
    a +=y;
    a +=z;

    return a;
}

Теперь поместите этот testFunc в другой test2.cpp и вызовите его из test.cpp, после которого произойдет ошибка сегментации. а = х

** Таким образом, если testFunc & Java_com_example_afeTest_testReference - это один и тот же файл cpp, он работает, если две функции в двух файлах cpp и вы хотите передать ссылку, это вызывает ошибку сегментации. Я также проверил с помощью extern.

Ответы [ 2 ]

0 голосов
/ 20 апреля 2011

Я использовал gnustl_static. Он не поддерживает передачу ссылок из одной разделяемой библиотеки в другую разделяемую библиотеку и вызывает ошибку сегментации. Это работает, когда они находятся в одной библиотеке.

0 голосов
/ 30 марта 2011

Вы пытаетесь изменить содержимое исходной строки const.Это не может быть хорошей идеей.Отбрасывать константу возвращаемого значения data () тоже неприятно.Является ли это причиной вашего segfault, я не уверен.В любом случае попробуйте это:

string tolower(const string& str){
    size_t iSize = str.size();
    string result = str;    
    for (size_t i=0; i<iSize; ++i) {
        result[i] = static_cast<char>(tolower(result[i]));
    }
    return result;
}

Редактировать:

Если вы действительно хотите, чтобы функция изменила входную строку на местеи вернуть ссылку на этот вход, вам нужно следующее.Обратите внимание на различия в первой строке.Также обратите внимание, что ваша исходная строка не может быть константной, если вы хотите ее изменить:

string& tolower(string& str) {
    size_t iSize = str.size();
    for (size_t i=0; i<iSize; ++i) {
        str[i] = static_cast<char>(tolower(str[i]));
    }
    return str;
}

Однако я бы сказал, что вторая версия хуже, и вам следует придерживаться первой.

...