簡體   English   中英

用於Java反射的Monodroid JNI調用私有方法

[英]Monodroid JNI for Java reflection to call a private method

在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的代碼。 不幸的是, Monodroid中沒有java.lang.reflect 但是,建議我可以使用Monodroid項目中的JNI運行此代碼。 Xamarin文檔指出,可以內聯JNI ,而不必綁定整個JAR。 不幸的是, 進一步的文檔沒有進一步說明 此外, JNIEnv文檔為空白。

看來我需要JNIEnv.CallVoidMethod() ,但我不知道如何執行。 我找不到示例或更多文檔。

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

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

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

我還沒有嘗試過,但是如果Android版Mono甚至包裝Java類的私有成員,僅使用C#反射就足夠了。

如果失敗,則可以嘗試JNI。

使用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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM