MonoDroid的JNI的Java反射来调用私有方法(Monodroid JNI for Java

2019-09-23 01:47发布

在MonoDroid的项目,我需要能够调用私有方法的类。 从上一个相关的问题的答案 ,似乎这是可能在Java中通过反射:

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import android.os.ParcelFileDescriptor;

...

ParcelFileDescriptor pipe[] = null;

try {
    Method createPipeMethod = ParcelFileDescriptor.class.getDeclaredMethod("createPipe");
    pipe = (ParcelFileDescriptor[]) createPipeMethod.invoke(null);
} catch (NoSuchMethodException e) {
    throw new RuntimeException(e);
} catch (IllegalAccessException e) {
        throw new RuntimeException(e);
} catch (InvocationTargetException e) {
    throw new RuntimeException(e);
}

我需要从MonoDroid的使用此代码。 不幸的是, java.lang.reflect是不具备的MonoDroid的 。 然而,有人建议我可以从我的MonoDroid的项目中运行使用JNI这个代码。 所述Xamarin文档指出直列JNI是可能 ,而无需将整个JAR结合。 不幸的是, 更多的文件没有再多说什么了关于这个问题的。 此外, 在JNIEnv的文档是空白。

它看起来像我需要JNIEnv.CallVoidMethod()但我不知道该怎么做。 我无法找到一个例子,或者更多的文件。

如何使用java.lang.reflect在我MonoDroid的项目,或者以其他方式调用私有方法.createPipeParcelFileDescriptor

Answer 1:

你尝试用C#反思Android.OS.ParcelFileDescriptor

http://docs.mono-android.net/index.aspx?link=T%3AAndroid.OS.ParcelFileDescriptor

我并没有尝试,但如果单为Android甚至包装的Java类的私有成员,简单地使用C#反射可能就足够了。

如果失败了,你可以追求的JNI尝试。



Answer 2:

它应该是可能的JNI: http://docs.xamarin.com/guides/android/advanced_topics/java_integration_overview/working_with_jni#_Static_Methods

粗略的草图未经测试:

var methodId = JNIEnv.GetStaticMethodID(ParcelFileDescriptor.Class.Handle, 
                                        "createPipe", 
                                        "()[Landroid/os/ParcelFileDescriptor;");
var result = JNIEnv.CallStaticObjectMethod(myCSharpFileDescriptorInstance.Handle,
                                           methodId);


文章来源: Monodroid JNI for Java reflection to call a private method