I am trying to use a C++ library in Java with JNA. In the header file of the library I have the following method declaration:
extern "C" void foo(const char** bar);
The paramterer bar
should be passed to foo
empty, and foo
vill assign it a value that I want to retreive in Java. How should the corresponding Java method declaration be set up (e.g. what Java type should I map bar
to), and how can I use it?
I have tried the following Java declarations:
void foo(String bar); void foo(String[] bar); void foo(Pointer bar);
They all result in the following error when I call foo
:
Exception in thread "main" java.lang.Error: Invalid memory access
Find below a small snippet.
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); } }
compile all sources
gcc -c -fPIC libfoo.cpp -o libfoo.o gcc -shared -o libfoo.so libfoo.o javac -cp jna-4.2.1.jar LibFooDemo.java
run the Java program
java -Djava.library.path=. -cp jna-4.2.1.jar:. LibFooDemo
output
foo bar foobar