调用JNI NewStringUTF时出现挂起异常';java.lang.NoSuchMethodError';

调用JNI NewStringUTF时出现挂起异常';java.lang.NoSuchMethodError';,java,android,android-ndk,Java,Android,Android Ndk,我不知道为什么在调用本机方法时抛出异常 本机代码: JNIEXPORT jstring JNICALL Java_org_amk_lockscreen_JNIActivity_getPackege(JNIEnv *env,jclass cls,jobject context){ jclass Context_class = (*env).FindClass("android/content/Context"); jmethodID midGetPackageName = (*en

我不知道为什么在调用本机方法时抛出异常

本机代码:

JNIEXPORT jstring JNICALL Java_org_amk_lockscreen_JNIActivity_getPackege(JNIEnv *env,jclass cls,jobject context){
    jclass Context_class = (*env).FindClass("android/content/Context");
    jmethodID midGetPackageName = (*env).GetMethodID(Context_class, "getPackageName", "(V)Ljava/lang/String;");
    if(midGetPackageName==0){
        return (*env).NewStringUTF("Not Found Method");
    }
    else{
        jobject packageName=(*env).CallObjectMethod( context, midGetPackageName);
        return (jstring)packageName;
    }
}
和我的java代码:

public class JNIActivity extends Activity {

    static {
        System.loadLibrary("myjni"); // "myjni.dll" in Windows, "libmyjni.so" in Unixes
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_jni);
        TextView txt = (TextView) findViewById(R.id.txtMessage);
        try {
            txt.setText(getPackege(getApplicationContext()));
        } catch (Exception exp) {
            txt.setText(exp.getMessage());
        }
    }

    public native String getMessage();

    public native String getPackege(Context con);
}
但运行此命令时,会引发异常:

JNI DETECTED ERROR IN APPLICATION: JNI NewStringUTF called with pending exception 'java.lang.NoSuchMethodError' thrown in java.lang.String org.amk.lockscreen.JNIActivity.getPackege(android.content.Context):-2
in call to NewStringUTF
from java.lang.String org.amk.lockscreen.JNIActivity.getPackege(android.content.Context)
我测试了不同的方法签名,如:

(Ljava/lang/Void;)Ljava/lang/String;     
   (V;)Ljava/lang/String;
但它再次抛出异常


哪里出错了?

GetMethodID引发异常。您没有检查是否使用env->ExceptionCheck(env)引发了异常,然后使用ExceptionClear()清除它,或者立即从函数返回,以便JVM处理它。请参见getMethodId上的Oracle文档:

例如(from:)findClass、GetStaticMethodID和CallStaticVoidMethod调用都会生成与GetMethodID类似的异常

int val=1;
jmethodID method;
jclass cls;

cls = (*env)->FindClass(env, "com/ibm/example/TestClass");
if ((*env)->ExceptionCheck(env)) {
   return ERR_FIND_CLASS_FAILED;
}
method = (*env)->GetStaticMethodID(env, cls, "setInfo", "(I)V");
if ((*env)->ExceptionCheck(env)) {
   return ERR_GET_STATIC_METHOD_FAILED;
}
(*env)->CallStaticVoidMethod(env, cls, method,val);
if ((*env)->ExceptionCheck(env)) {
   return ERR_CALL_STATIC_METHOD_FAILED;
}

您的方法定义在这里是错误的:

jmethodID-midGetPackageName=(*env).GetMethodID(上下文类,“getPackageName”,“V)Ljava/lang/String;”

您不能在参数中传递(V),因为这意味着您要传递一个void参数,这在Java中没有意义。您需要弄清楚传递给java方法的参数类型(例如String),以及该方法返回的返回类型(例如void

因此,您可能打算这样做:


jmethodID midGetPackageName=(*env).GetMethodID(上下文类,“getPackageName”,“Ljava/lang/String;(V)”

您不应该使用->语法:(*env)->NewStringUTF(“…”);当我使用此语法时,发生了.gradle错误:错误:“->”的基操作数具有非指针类型“JNIEnv{aka_JNIEnv}”,可以给出NDKI中异常处理的示例。如果存在异常,您有两个选择:清除它,或者返回VM,后者将处理它。但是异常是NoSuchMethodError。澄清这一点有什么意义?