入门不透明结构由参数在JNA返回(Getting an opaque struct returned

2019-09-30 15:27发布

我想打电话给苹果的方法Security.h框架,通过引用返回一个结构,就像这样:

int findSomething(SomeStruct *s)

(具体而言,它的这种方法 ,而我试图获得itemRef 。有一个使用示例在这里 。)的问题是,我不知道哪些字段SomeStruct有或有多大是。 它的存在只是为了传递给其他本机库函数。 所以,我想是这样的(JAVA):

interface SomeLib extends Library {
    int findSomething(Pointer p);
}

...
Pointer p = ... // Not sure how to make this
nativeLib.findSomething(p)
// Do something with p

如果我能做到sizeof(SomeStruct)在Java中,我可以创建使用JNAs指针Memory ,我想。 我可以写一个本地方法返回sizeof(SomeStruct)但我不希望本地组件添加到我自己的代码。

这类似于这个问题 ,但它要求在哪里的领域的情况下SomeStruct在运行时已知的,而在我的情况下,场均有意地库作者掩盖。

Answer 1:

所述SecKeychainItemRef类型被定义为一个指向结构 。 这意味着SecKeychainFindGenericPassword功能实际上需要一个指向一个指针作为itemRef说法,正因为如此,你可以使用JNA PointerByReference类作为参数。

一个成功的电话后,就可以使用PointerByReference.getValue()来获得不透明指针。

/* int SecKeychainFindGenericPassword(
 *     Pointer keychainOrArray,
 *     int serviceNameLength,
 *     String serviceName,
 *     int accountNameLength,
 *     String accountName,
 *     IntByReference *passwordLength,
 *     PointerByReference passwordData,
 *     PointerByReference itemRef
 * );
 */

static void main() {
    IntByReference passLength = new IntByReference(0);
    PointerByReference passwordData = new PointerByReference();
    PointerByReference itemRef = new PointerByReference();

    int result = SecKeychainFindGenericPassword(
        keychainOrArray,
        "service name".length(),
        "service name",
        "account".length(),
        "account",
        passLength,
        passwordData,
        itemRef
    );

    if (result == 0) {
        System.out.printf(
            "OSStatus: %d, passDataPtr: 0x%08X, itemRefPtr: 0x%08X%n",
            result,
            Pointer.nativeValue(passwordData.getValue()),
            Pointer.nativeValue(itemRef.getValue())
        );
    } else {
        /* Use SecCopyErrorMessageString to get a human-readable message */
        System.out.printf("An error occurred: %d%n", result);
    }
}

如果你调用在实际项目中这种方法,我建议建立一个名为类SecKeychainItemRef扩展了PointerByReference类。 这传达参数的类型,以更清晰的方式的读者,即使它不会让你访问结构的内部。



文章来源: Getting an opaque struct returned by parameter in JNA