Criando um objeto CFString com JNA
-
06-07-2019 - |
Pergunta
Eu estou tentando obter o jeito de usar JNA com Mac OS X. Eu quero acessar uma biblioteca de carbono, para a qual não há cacau equivalente, de modo Rococoa não pode me ajudar (eu acho ...)
Eu estou preso ao tentar chamar uma função de carbono que requer CFStringRef como parâmetro. Como posso criar uma CFStringRef de um String Java?
Aqui está minha tentativa até agora:
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.PointerByReference;
public class JnaTest {
public interface AXUIElement extends Library {
AXUIElement INSTANCE = (AXUIElement) Native.loadLibrary("Carbon", AXUIElement.class);
Pointer AXUIElementCreateApplication(int pid);
// HELP: String is clearly wrong here but what should I use?
int AXUIElementCopyAttributeValue(Pointer element, String attribute, PointerByReference value);
}
public static void main(String[] args) {
final int pid = 5264; // make sure this is a valid pid
final Pointer elementRef = AXUIElement.INSTANCE.AXUIElementCreateApplication(pid);
// HELP: attribute should be of type CFStringRef
final String attribute = "AXWindows";
PointerByReference value = new PointerByReference();
final int error = AXUIElement.INSTANCE.AXUIElementCopyAttributeValue(elementRef, attribute, value);
if (error == 0) {
System.out.println("value = " + value);
} else {
System.out.println("Failure: " + error);
}
}
}
Solução
Eu vim com isso:
public static CFStringRef toCFString(String s) {
final char[] chars = s.toCharArray();
int length = chars.length;
return AXUIElement.INSTANCE.CFStringCreateWithCharacters(null, chars, AXAPI.createCFIndexFor(length));
}
com esta definição:
CFStringRef CFStringCreateWithCharacters(
Void alloc, // always pass NULL
char[] chars,
CFIndex numChars
);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow