我想打电话给苹果的方法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
在运行时已知的,而在我的情况下,场均有意地库作者掩盖。
所述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
类。 这传达参数的类型,以更清晰的方式的读者,即使它不会让你访问结构的内部。