1
기본 메소드에서 MainActivity.Native 메소드를 호출하려고 할 때 초보자를위한 JNI입니다. 기본 method.Then 프로그램 충돌에 의한 CallStaticVoidMethod 호출 MainActivity의 static 메소드 :CallStaticVoidMethod가 JNI에서 유효하지 않은 jobject를 사용하도록 throw 된 이유
이는 네이티브 메소드 코드 :
void Java_com_lijing_ndkjnidemeo_activity_MainActivity_staticMethod(JNIEnv *env, jobject obj, jobject aty) {
LOGI("native_staticMethod");
jclass cls;
jmethodID mid;
//1.Get the class method id
cls = (*env)->GetObjectClass(env, aty);
mid = (*env)->GetStaticMethodID(env, cls, "changeStr", "()V");
if (mid == NULL) {
LOGE("GetStaticMethodID error");
return; /* method not found */
}
LOGE("GetStaticMethodID sucess");
//2.Call the CallStatic<ReturnValueType>Method function to call the corresponding function.
(*env)->CallStaticVoidMethod(env, cls, mid);
}
기본 방법은 MainActivity에서 호출
private void jniTextMethod8() {
staticMethod(this);
tvStaticMethod.setText(sStr);
}
public static native String staticMethod(MainActivity aty);
public static void changeStr() {
sStr = "Change String";
}
로그 :
11-07 09:57:35.477 4310-4310/com.lijing.ndkjnidemeo I/JNI_UTIL: native_staticMethod
11-07 09:57:35.477 4310-4310/com.lijing.ndkjnidemeo E/JNI_UTIL: GetStaticMethodID sucess
11-07 09:57:35.493 4310-4310/com.lijing.ndkjnidemeo A/art: art/runtime/java_vm_ext.cc:410] JNI DETECTED ERROR IN APPLICATION: use of invalid jobject 0xffde5e68
11-07 09:57:35.494 4310-4310/com.lijing.ndkjnidemeo A/art: art/runtime/java_vm_ext.cc:410] from java.lang.String com.lijing.ndkjnidemeo.activity.MainActivity.staticMethod(com.lijing.ndkjnidemeo.activity.MainActivity)
11-07 09:57:35.494 4310-4310/com.lijing.ndkjnidemeo A/art: art/runtime/java_vm_ext.cc:410] "main" prio=5 tid=1 Runnable
11-07 09:57:35.494 4310-4310/com.lijing.ndkjnidemeo A/art: art/runtime/java_vm_ext.cc:410] | group="main" sCount=0 dsCount=0 obj=0x73712258 self=0xf3df4a00
11-07 09:57:35.494 4310-4310/com.lijing.ndkjnidemeo A/art: art/runtime/java_vm_ext.cc:410] | sysTid=4310 nice=0 cgrp=default sched=0/0 handle=0xf777cc00
11-07 09:57:35.494 4310-4310/com.lijing.ndkjnidemeo A/art: art/runtime/java_vm_ext.cc:410] | state=R schedstat=(304952424 35818763 258) utm=12 stm=17 core=1 HZ=100
11-07 09:57:35.494 4310-4310/com.lijing.ndkjnidemeo A/art: art/runtime/java_vm_ext.cc:410] | stack=0xff5e8000-0xff5ea000 stackSize=8MB
11-07 09:57:35.494 4310-4310/com.lijing.ndkjnidemeo A/art: art/runtime/java_vm_ext.cc:410] | held mutexes= "mutator lock"(shared held)
11-07 09:57:35.494 4310-4310/com.lijing.ndkjnidemeo A/art: art/runtime/java_vm_ext.cc:410] native: #00 pc 0058b0e2 /system/lib/libart.so (art::DumpNativeStack(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, int, char const*, art::ArtMethod*, void*)+226)
11-07 09:57:35.494 4310-4310/com.lijing.ndkjnidemeo A/art: art/runtime/java_vm_ext.cc:410] native: #01 pc 00550d2e /system/lib/libart.so (art::Thread::Dump(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) const+286)
11-07 09:57:35.494 4310-4310/com.lijing.ndkjnidemeo A/art: art/runtime/java_vm_ext.cc:410] native: #02 pc 003a489f /system/lib/libart.so (art::JavaVMExt::JniAbort(char const*, char const*)+1247)
11-07 09:57:35.494 4310-4310/com.lijing.ndkjnidemeo A/art: art/runtime/java_vm_ext.cc:410] native: #03 pc 003a5fc2 /system/lib/libart.so (art::JavaVMExt::JniAbortF(char const*, char const*, ...)+116)
11-07 09:57:35.495 4310-4310/com.lijing.ndkjnidemeo A/art: art/runtime/java_vm_ext.cc:410] native: #04 pc 00548fc7 /system/lib/libart.so (art::Thread::DecodeJObject(_jobject*) const+1975)
오, 고마워요, 너무 바보 같았습니다. 원래 수정 된 문자열로 돌아가려고 의도했지만 나중에 변경되었지만 기본 방법을 변경하는 것을 잊었습니다. 다시 한번 감사드립니다. 나는 부주의했습니다. – Jing