2016-04-04 4 views
1

Я пытаюсь использовать библиотеку C++ в Java с JNA. В заголовочном файле библиотеки У меня есть метод следующее заявление:Сопоставление const char ** с типом Java с JNA

extern "C" void foo(const char** bar); 

paramterer bar должен быть передан foo пустой, и foo Vill присвоить ему значение, которое я хочу извлечь в Java. Как должно быть настроено соответствующее объявление Java-метода (например, какой тип Java должен указывать bar) и как его использовать?

Я попытался следующие объявления Java:

void foo(String bar); 
void foo(String[] bar); 
void foo(Pointer bar); 

Они все результат в следующей ошибки, когда я звоню foo:

Exception in thread "main" java.lang.Error: Invalid memory access

+0

После Javadoc [сортировочной] (https://jna.java.net/javadoc/overview-summary.html#marshalling) 'String []'. Если вы получаете источники [JNA] (https://github.com/java-native-access/jna.git), у вас есть обновленная документация в './Www'. – SubOptimal

+0

Связанная документация предлагает 'String []' для 'char **'. Имеет ли значение 'const char **' значение? Использование 'String []' дает мне ошибку, упомянутую в вопросе. – Anders

+0

@SubOptimal После тестирования еще немного, получается, используя 'String []' works - я просто не смог заставить его работать из-за несвязанной ошибки. Если вы хотите написать ответ на основе ваших комментариев, не стесняйтесь делать это. В противном случае я напишу сам ответ. Спасибо. – Anders

ответ

1

Найти ниже небольшой фрагмент кода.

libfoo.cpp

#include <stdio.h> 
extern "C" void foo(const char** bar); 

void foo(const char** bar) { 
    for (int i = 0; bar[i] != '\0'; i++) { 
     fprintf(stdout, "%s\n", bar[i]); 
    } 
} 

LibFooDemo.java

import com.sun.jna.Library; 
import com.sun.jna.Native; 

public class LibFooDemo { 

    public interface FooLibrary extends Library { 
     FooLibrary INSTANCE = (FooLibrary) 
       Native.loadLibrary("foo", FooLibrary.class); 
     void foo(String[] format); 
    } 

    public static void main(String[] args) { 
     String[] vals = {"foo", "bar", "foobar"}; 
     FooLibrary.INSTANCE.foo(vals); 
    } 
} 

собрать все источники

gcc -c -fPIC libfoo.cpp -o libfoo.o 
gcc -shared -o libfoo.so libfoo.o 
javac -cp jna-4.2.1.jar LibFooDemo.java 

запустить программу Java

java -Djava.library.path=. -cp jna-4.2.1.jar:. LibFooDemo 

выход

foo 
bar 
foobar 
Смежные вопросы