0

在 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(),但我不知道该怎么做。我找不到示例或更多文档。

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

4

2 回答 2

0

您是否尝试过使用 C# 反射Android.OS.ParcelFileDescriptor

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

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

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

于 2012-09-27T09:03:01.433 回答
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);
于 2013-10-01T09:39:45.437 回答