Android版Mono中的JNIHandle所有权

Android版Mono中的JNIHandle所有权,android,xamarin.android,Android,Xamarin.android,有人能给我解释一下Mono for Android中三个枚举值的确切含义吗?它们之间的区别是什么?我很抱歉没有更新类库文档 文档说明了本节中各种JniHandleOwnership值的含义 根据评论更新: 如果不应对句柄参数执行任何操作,则应使用JniHandleOwnership.DoNotTransfer。这应该始终在内部使用 当您有一个本地引用(例如,您调用了JNIEnv.CallObjectMethod(),它返回一个本地引用)并且希望将本地引用的所有权传递给包装器时,应该使用JniH

有人能给我解释一下Mono for Android中三个枚举值的确切含义吗?它们之间的区别是什么?

我很抱歉没有更新类库文档

文档说明了本节中各种
JniHandleOwnership
值的含义

根据评论更新:

  • 如果不应对
    句柄
    参数执行任何操作,则应使用
    JniHandleOwnership.DoNotTransfer
    。这应该始终在内部使用
  • 当您有一个本地引用(例如,您调用了
    JNIEnv.CallObjectMethod()
    ,它返回一个本地引用)并且希望将本地引用的所有权传递给包装器时,应该使用
    JniHandleOwnership.TransferLocalRef
  • 当您拥有全局引用并且希望将全局引用的所有权传递给包装器时,应使用
    JniHandleOwnership.TransferGlobalRef

    IntPtr grefFoo = JNIEnv.FindClass("Foo"); // FindClass() returns a gref
    var Foo = Java.Lang.Object.GetObject<Java.Lang.Class>(grefFoo, JniHandleOwnership.TransferGlobalRef);
    
    IntPtr grefFoo=JNIEnv.FindClass(“Foo”);//FindClass()返回一个gref
    var Foo=Java.Lang.Object.GetObject(grefFoo、JniHandleOwnership.TransferGlobalRef);
    

我仍然不完全理解这一点。这个定义正确吗?DoNotTransfer:手动删除ref | TransferLocalRef:在构造函数中删除ref | TransferGlobalRef:在析构函数/终结器中删除ref |我为什么要保留引用(即为什么我要使用TransferGlobalRef)?为什么要使用
TransferGlobalRef
?因为您有一个全局ref,并且希望“传递所有权”,这样您就不必担心它:IntPtr grefFoo=JNIEnv.FindClass(“Foo”);/*FindClass()返回一个gref*/var Foo=Java.Lang.Object.GetObject(grefFoo,JniHandleOwnership.TransferGlobalRef);找到了这个链接,这可能会让整个事情更清楚一些: