Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin.android 来自monodroid应用程序内的JNIEnv调用_Xamarin.android_Jnienv - Fatal编程技术网

Xamarin.android 来自monodroid应用程序内的JNIEnv调用

Xamarin.android 来自monodroid应用程序内的JNIEnv调用,xamarin.android,jnienv,Xamarin.android,Jnienv,这是我在monodroid应用程序中通过JNIEnv访问的Java类 package-mypackage; 导入android.util.Log; 公共类JavaScriptInterface{ 公共字符串submitAns=“”; //原始问题中的JNI使用默认构造函数。 //要么显式地提供一个,要么使用隐式的。。。 公共JavaScriptInterface() { } 公共字符串getSelctd() { 返回提交者; } } 我可以通过以下语句实例化该类: Java.Lang.O

这是我在monodroid应用程序中通过JNIEnv访问的Java类

package-mypackage;
导入android.util.Log;
公共类JavaScriptInterface{
公共字符串submitAns=“”;
//原始问题中的JNI使用默认构造函数。
//要么显式地提供一个,要么使用隐式的。。。
公共JavaScriptInterface()
{
}   
公共字符串getSelctd()
{
返回提交者;
}
}
我可以通过以下语句实例化该类:

Java.Lang.Object jclassWrp\ux;
IntPtr JavaScriptInterface_Class=JNIEnv.FindClass(“mypackage.JavaScriptInterface”);
IntPtr JavaScriptInterface_ctor=JNIEnv.GetMethodID(JavaScriptInterface_类,“,”()V”)//(Landroid/context/context;)V
IntPtr jsInterfaceinstance=JNIEnv.NewObject(JavaScriptInterface类,JavaScriptInterface类);
jclassWrp_2;=新Java.Lang.Object(jsInterfaceinstance_2;,JniHandleOwnership.TransferGlobalRef);
但是当我尝试创建对象以访问getSelctd()方法时:

IntPtr ipApid = JNIEnv.GetMethodID(jclassWrp_, "getSelctd", "()Ljava/lang/String;");
它抛出NoSuchMethodExist异常。。。 请告诉我我是否用正确的方式做了,我在这里错过了什么

我可以通过以下语句实例化该类:

Java.Lang.Object jclassWrp\ux;
IntPtr JavaScriptInterface_Class=JNIEnv.FindClass(“mypackage.JavaScriptInterface”);
JNI使用应该使用JNI约定,因此
mypackage/JavaScriptInterface
(注意
/
而不是

JNIEnv.GetMethodID()
接受类句柄,而不是实例。首先,上面的代码不应该编译(
Java.Lang.Object
!=
IntPtr
)。其次,
jclassWrp
包含一个
mypackage.JavaScriptInterface
实例,而不是
mypackage.JavaScriptInterface
类实例

相反,要:

IntPtr ipApid=JNIEnv.GetMethodID(JavaScriptInterface_类,“getSelctd”,“Ljava/lang/String;”);
最后,当您不再需要它时,不要忘记
JNIEnv.DeleteGlobalRef(JavaScriptInterface_类)
,否则会泄漏gref

完整代码:

//FindClass()返回gref;必须释放(见下文)
IntPtr JavaScriptInterface_Class=JNIEnv.FindClass(“mypackage/JavaScriptInterface”);
//MethodId不需要被释放
IntPtr JavaScriptInterface_ctor=JNIEnv.GetMethodID(JavaScriptInterface_类,
(“V”);
IntPtr JavaScriptInterface_getSelctd=JNIEnv.GetMethodID(JavaScriptInterface_类,
“getSelctd”,“()Ljava/lang/String;”;
//JNIEnv.NewObject()&JNIEnv.CallObjectMethod()返回lrefs;在下面释放
IntPtr lrefInstance=JNIEnv.NewObject(JavaScriptInterface_类,
JavaScriptInterface(接口);
IntPtr lrefSelectd=JNIEnv.CallObjectMethod(jsInterfaceinstance,ipApid);
//JNIHandleOwnery.TransferLocalRef导致为我们发布lRefSelected
所选字符串=JNIEnv.GetString(lrefSelectd、JniHandleOwnership.TransferLocalRef);
//资源清理
JNIEnv.DeleteLocalRef(lrefInstance);
DeleteGlobalRef(JavaScriptInterface_类);
我可以通过以下语句实例化该类:

Java.Lang.Object jclassWrp\ux;
IntPtr JavaScriptInterface_Class=JNIEnv.FindClass(“mypackage.JavaScriptInterface”);
JNI使用应该使用JNI约定,因此
mypackage/JavaScriptInterface
(注意
/
而不是

JNIEnv.GetMethodID()
接受类句柄,而不是实例。首先,上面的代码不应该编译(
Java.Lang.Object
!=
IntPtr
)。其次,
jclassWrp
包含一个
mypackage.JavaScriptInterface
实例,而不是
mypackage.JavaScriptInterface
类实例

相反,要:

IntPtr ipApid=JNIEnv.GetMethodID(JavaScriptInterface_类,“getSelctd”,“Ljava/lang/String;”);
最后,当您不再需要它时,不要忘记
JNIEnv.DeleteGlobalRef(JavaScriptInterface_类)
,否则会泄漏gref

完整代码:

//FindClass()返回gref;必须释放(见下文)
IntPtr JavaScriptInterface_Class=JNIEnv.FindClass(“mypackage/JavaScriptInterface”);
//MethodId不需要被释放
IntPtr JavaScriptInterface_ctor=JNIEnv.GetMethodID(JavaScriptInterface_类,
(“V”);
IntPtr JavaScriptInterface_getSelctd=JNIEnv.GetMethodID(JavaScriptInterface_类,
“getSelctd”,“()Ljava/lang/String;”;
//JNIEnv.NewObject()&JNIEnv.CallObjectMethod()返回lrefs;在下面释放
IntPtr lrefInstance=JNIEnv.NewObject(JavaScriptInterface_类,
JavaScriptInterface(接口);
IntPtr lrefSelectd=JNIEnv.CallObjectMethod(jsInterfaceinstance,ipApid);
//JNIHandleOwnery.TransferLocalRef导致为我们发布lRefSelected
所选字符串=JNIEnv.GetString(lrefSelectd、JniHandleOwnership.TransferLocalRef);
//资源清理
JNIEnv.DeleteLocalRef(lrefInstance);
DeleteGlobalRef(JavaScriptInterface_类);
IntPtr JavaScriptInterface_ctor = JNIEnv.GetMethodID(JavaScriptInterface_Class, "<init>", "()V");
IntPtr jsInterfaceinstance_ = JNIEnv.NewObject(JavaScriptInterface_Class, JavaScriptInterface_ctor);
jclassWrp_ = new Java.Lang.Object(jsInterfaceinstance_, JniHandleOwnership.TransferGlobalRef);