【问题标题】:Monodroid JNI for Java reflection to call a private methodMonodroid JNI for Java 反射调用私有方法
【发布时间】:2013-10-01 17:39:45
【问题描述】:

在 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,或者以其他方式调用 ParcelFileDescriptor 上的私有方法 .createPipe?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-27
        • 1970-01-01
        • 2019-08-25
        • 1970-01-01
        • 1970-01-01
        • 2013-04-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多