Xamarin.android 来自monodroid应用程序内的JNIEnv调用
这是我在monodroid应用程序中通过JNIEnv访问的Java类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
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);