Передача указателя из JNI в Java с использованием длинного - PullRequest
7 голосов
/ 27 апреля 2011

Я пытаюсь передать структуру в виде указателя из JNI в Java, чтобы потом можно было передать ее обратно из Java в JNI. Я прочитал эту ветку: Передача указателей между C и Java через JNI , но мне это не удалось.

У меня довольно сложная структура: struct myStruct_s myStruct;

Из Java я вызываю функцию JNI для инициализации структуры и возврата long (указатель на структуру):

JNIEXPORT jlong JNICALL Java_example_ExampleJNI_getStruct(JNIEnv *jenv, jclass jcls) {
    struct myStruct_s mystruct;
    long *lp = (long*)&myStruct;
    return lp;
}

Затем я вызываю метод Java с таким длинным аргументом. В JNI я хочу использовать созданную ранее strcuture. Мне так нравится:

JNIEEXPORT jint JNICALL Java_example_ExampleJNI_methode1(JNIEnv *jenv, jclass jcls, jlong jarg) {
    struct myStruct_s *arg = (struct myStruct_s *)&jarg;
    ...
}

Ну, это не работает. Я предполагаю, что мой бросок длинного в структуру неправильный. Как я должен это делать? Спасибо.


РЕДАКТИРОВАТЬ : Спасибо за подсказки, вот рабочие функции

JNIEXPORT jint JNICALL Java_example_ExampleJNI_methode1(JNIEnv *jenv, jclass jcls, jlong jarg) {
    struct myStruct_s *arg;
    arg = (struct myStruct_s *)jarg;
    ...
} 

JNIEXPORT jlong JNICALL Java_example_ExampleJNI_getStruct(JNIEnv *jenv, jclass jcls) {
    struct myStruct_s *myStruct;
    myStruct = (struct myStruct_s *)malloc(sizeof(struct myStruct_s));
    long lp = (long)myStruct;
    return lp;
}

Ответы [ 3 ]

5 голосов
/ 27 апреля 2011

В вашем примере

struct myStruct_s mystruct;

- локальная переменная в стеке, и поэтому недоступна после возврата из функции.Возможно, это всего лишь сокращение вашего кода, но если нет, то используйте malloc (sizeof (struct myStruct_s)), чтобы получить себе кучу выделения.

Тогда возникает вопрос, когда вы собираетесь освободитьсяэто распределение, следите за утечками памяти.

3 голосов
/ 27 апреля 2011

Память этой структуры уничтожается после того, как метод возвращается, потому что он был помещен в стек, а не в кучу, попробуйте это:

JNIEXPORT jlong JNICALL Java_example_ExampleJNI_getStruct(JNIEnv *jenv, jclass jcls) {
    long *lp = (long*)malloc(sizeof(struct myStruct_s));
    return lp;
}

Ps: почему long * а не просто долго ?

1 голос
/ 27 апреля 2011

В дополнение к предложению @ Моиза я бы нацелил указатель на скорость long, чем long *

long lp = (long)&myStruct;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...