Использование JNA для доступа к структуре, содержащей вектор - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть библиотека C ++, которая использует структуру, которая содержит вектор.У меня возникают трудности с определением правильного способа доступа к нему из Java через JNA.

Моя структура C ++:

#include <vector>

struct topic {
    char* src_id;
    char* dest_id;
    int32_t num;
    std::vector<char*> names;
};

Мой класс Java:

public final class Topic extends Structure {

    public String src_id;
    public String dest_id;
    public int num;
    public String[] names; // This doesn't work

    public Topic() {

    }

    @Override
    protected List<String> getFieldOrder() {
        return Arrays.asList(new String[] { "src_id", "dest_id", "num", "names" });
    }

}

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Вы можете использовать Pointer и передать StringArray, используя public StringArray(String[] strings), как указано здесь

public String src_id;
public String dest_id;
public int num;
public Pointer names;

String[] namesArray= new String[2];
//Assign two names to namesArray

//Construct StringArray with namesArray and pass it to Pointer
names = new StringArray(namesArray);
0 голосов
/ 19 февраля 2019

Это решение сработало для меня:

package com.example;

import java.util.Arrays;
import java.util.List;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.StringArray;
import com.sun.jna.Structure;

public class Example {

    public interface CLibrary extends Library {

        public static class Topic extends Structure {
            public static class ByReference extends Topic implements Structure.ByReference {
            }

            public String src_id;
            public String dest_id;
            public int num;

            public int numVals;
            public Pointer names; // char**

            @Override
            protected List<String> getFieldOrder() {
                return Arrays.asList(new String[] { "src_id", "dest_id", "num", "numVals", "names" });
            }
        }

        public void sendTopic(Topic.ByReference pVal);
    }

    public static void main(String[] args) {

        final CLibrary clib = Native.loadLibrary("example.dll", CLibrary.class);

        final String[] myArray = new String[5];
        myArray[0] = "one";
        myArray[1] = "two";
        myArray[2] = "three";
        myArray[3] = "four";
        myArray[4] = "five";

        CLibrary.Topic.ByReference ref = new CLibrary.Topic.ByReference();
        ref.numVals = 5;
        ref.names = new StringArray(myArray);

        clib.sendTopic(ref);
    }
}
...