Когда я вызываю собственный код в первый раз, он возвращает правильный результат, но во второй раз возвращает значение мусора.
Вот нативный код:
JNIEXPORT jstring JNICALL
Java_com_example_project_NativeCodes_method2(JNIEnv *env, jobject thisObj,
jstring st) {
const char* st1=env->GetStringUTFChars(st,0);
string str=st1;
const int len=str.length();
for(int i=0;i<len;i++){
if (str[i]>=97 && str[i]<=122)
str[i] = str[i]-32;
}
.....
env->ReleaseStringUTFChars(st, st1);
return env->NewStringUTF(str.c_str());
}
И в классе Java я объявляю нативный метод следующим образом
public class NativeCodes(){
static{
System.loadLibrary("abclib");
}
public synchronized native String method2(String s);
}
В MainActivity.java я вызываю нативный метод, например:
String s1,s2,s3,s4;
s1=edttxt1.getText().toString();
s2=edttxt2.getText().toString();
NativeCodes nc=new NativeCodes();
s3=nc.method2(s1);
s4=nc.method2(s2);
Во время отладки я обнаружил, что s3 получает правильный результат, тогда как s4 получает значение мусора.
Я думаю, что я освобождаю указатель правильно с env-> ReleaseStringUTFChars (st, st1);
Но если оператор Log () вставляется между двумя вызовами метода, оба вызова возвращают правильный результат. Например,
s3=nc.method2(s1);
Log.i("String","Value: "+s3);
s4=nc.method2(s2);
Log.i("String","Value: "+s4);
Это дает ожидаемый результат. Но я не хочу вставлять ненужный код, так как сделано много таких собственных вызовов методов.
где я делаю не так? Любая помощь высоко ценится.
Задача ещё не решена.
Других решений пока нет …