JNA를 사용하여 Java에서 C 라이브러리를 호출합니다. 방법이가하는 즉,이 포인터의 배열 구조체 것으로 예상JNA (Java) : 구조체에 포인터 배열을 전달하는 방법은 무엇입니까?
void printStructArray(SomeStruct **someStruct, int arraySize);
: 내 C 코드에서
내가 가진
void printStructArray(SomeStruct **someStruct, int arraySize) {
for(int i = 0; i < arraySize; i++) {
cout << "someStruct: " << someStruct[i]->aLong << " " << someStruct[i]->aString << " " << someStruct[i]->aDouble << endl;
}
}
그냥 장난감 예,하지만 나는이 실제 라이브러리에 대해 이야기하고 싶습니다. 같은 유형의 인수가 필요하지만, 장난감 예제를 사용하면 여기에서 설명하기가 더 쉽다고 생각합니까?
모든 것을 시도했지만 (JNA에서이 함수를 선언하고 (ii) JNA에서이 함수를 호출하는 방법을 잘 모르겠습니다.
내 최신 (실패) 시도는 다음과 같습니다
SomeStruct.byReference[] structs = new SomeStruct.byReference[]{
new SomeStruct.byReference(123,"hey!",1.23),
new SomeStruct.byReference(456,"cool!",1.45),
new SomeStruct.byReference(789,"world!",1.67) };
PointerByReference pointerByReference = new PointerByReference(structs[0].getPointer());
JniTest.instance.printStructArray(pointerByReference, 3);
이가 SIGSEGV가 발생합니다.
대안 :
가void printStructArray(SomeStruct.byReference[] someStructarray, int num);
이것으로 '0'을 제공한다 :
SomeStruct.byReference[] structs = new SomeStruct.byReference[]{
new SomeStruct.byReference(123,"hey!",1.23),
new SomeStruct.byReference(456,"cool!",1.45),
new SomeStruct.byReference(789,"world!",1.67) }; JniTest.instance.printStructArray(structs, 3);
방법과 마찬가지로 선언
는SomeStruct.byReference[] structs = (SomeStruct.byReference[]) new SomeStruct().toArray(new SomeStruct.byReference[]{
new SomeStruct.byReference(123,"hey!",1.23),
new SomeStruct.byReference(456,"cool!",1.45),
new SomeStruct.byReference(789,"world!",1.67) });
PointerByReference pointerByReference = new PointerByReference(structs[0].getPointer());
JniTest.instance.printStructArray(pointerByReference, 3);
이
이 또한 시도 ArrayStoreException를에게 원인 그만큼 좋은 점은 충돌이 아니지만 올바른 동작을 제공하지는 않지만 함수의 출력입니다.
생각하십니까?
이것은 C++이므로 JNA를 사용하여 호출하기 전에 C 인터페이스에 C 인터페이스 라이브러리를 작성하지 않아도됩니까? –
Java 태그가 필요한 이유는 무엇입니까? –
@JimGarrison : 그는 JNI 또는 JNA를 통해 Java에서 C++ 코드를 호출하는 것에 대해 질문합니다. 그렇습니다. 이는 Java와 관련되어 있습니다. –