安卓 JNI NewStringUTF调用了挂起的异常“java”。lang.NoSuchMethodError'
我不知道为什么在调用本机方法时抛出异常
本机代码:
JNIEXPORT jstring JNICALL Java_org_amk_lockscreen_JNIActivity_getPackege(JNIEnv *env,jclass cls,jobject context){
jclass Context_class = (*env).FindClass("安卓/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(安卓.content.Context):-2
in call to NewStringUTF
from java.lang.String org.amk.lockscreen.JNIActivity.getPackege(安卓.content.Context)
我测试了不同的方法签名,如:
(Ljava/lang/Void;)Ljava/lang/String;
(V;)Ljava/lang/String;
但它再次抛出异常
我哪里出错了
# 1 楼答案
您的方法定义在这里是错误的:
jmethodID midGetPackageName = (*env).GetMethodID(Context_class, "getPackageName", "(V)Ljava/lang/String;");
您不能在参数中传递(V),因为这意味着您要传递一个void参数,这在Java中没有意义。您需要弄清楚传递给java方法的参数类型(例如String),以及该方法返回的返回类型(例如void)
因此,您可能打算这样做:
jmethodID midGetPackageName = (*env).GetMethodID(Context_class, "getPackageName", "Ljava/lang/String;(V)");
# 2 楼答案
GetMethodID正在引发异常。您没有检查是否使用env引发了异常->;ExceptionCheck(env),然后使用ExceptionClear()清除它,或者立即从函数返回,以便JVM处理它。请参见getMethodId上的Oracle文档:http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html
例如(从http://www.ibm.com/developerworks/library/j-jni/:)findClass、GetStaticMethodID和CallStaticVoidMethod调用都会生成与GetMethodID类似的异常