【发布时间】:2015-11-12 15:07:39
【问题描述】:
我不知道为什么调用原生方法时会抛出异常。
本机代码:
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;
但它再次抛出异常。
我哪里做错了?
【问题讨论】:
-
你不应该使用 -> 语法:(*env)->NewStringUTF("...");
-
当我使用这种语法时,发生.gradle 错误:错误:错误:'->' 的基本操作数具有非指针类型'JNIEnv {aka _JNIEnv}'
标签: java android android-ndk