Monodroid JNI for Java反射调用私有方法

时间:2012-09-27 01:51:54

标签: c# java java-native-interface xamarin.android jnienv

在Monodroid项目中,我需要能够在类上调用私有方法。从an answer on a related question开始,似乎这可以通过反射在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 is not available in Monodroid。但是,有人建议我可以使用Monodroid项目中的JNI运行此代码。 Xamarin documentation states that inline JNI is possible,无需绑定整个JAR。不幸的是,further documentation没有就此主题发表更多意见。此外,documentation on JNIEnv是空白的。

看起来我需要JNIEnv.CallVoidMethod(),但我不知道该怎么做。我找不到一个例子或进一步的文档。

如何在我的Monodroid项目中使用java.lang.reflect,或以其他方式在.createPipe上调用私有方法ParcelFileDescriptor

2 个答案:

答案 0 :(得分:0)

您是否尝试在Android.OS.ParcelFileDescriptor上使用C#反射?

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

我还没有尝试过,但如果Mono for Android甚至包装了Java类的私有成员,那么仅仅使用C#反射就足够了。

如果失败,您可以继续尝试JNI。

答案 1 :(得分:0)

应该可以使用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);