Mam poważny problem z ogarnięciem JNA. Mam taki oto kod napisany w C
typedef void (*example_ptr)(const char*);
void exampleMethod(const char* value)
{
printf("This is the string: %s\n", value);
}
void example_triggerCallback(const example_ptr func, const char* str) {
printf("provided str: %s", str);
func(str);
}
Guru jakimś C nie jestem, ale kod wydaje się być poprawny. Co chcę osiągnąć? Chciałbym podać do funkcji example_triggerCallback oba argumenty z poziomu Javy. Przykład jest dość uproszczoną formą tego co chcę osiągnąć. Na chwilę obecną kod po stronie Javy wygląda tak:
public class Main {
public interface TestLibrary extends Library {
TestLibrary INSTANCE = (TestLibrary)
Native.loadLibrary("libtest",
TestLibrary.class);
interface ExampleCallback extends Callback {
void invoke(String str);
}
class ExampleCallbackImpl implements ExampleCallback {
public void invoke(String str) {
System.out.println("example: " + str);
}
}
void example_triggerCallback(ExampleCallback callback, String str);
}
public static void main(String[] args) {
TestLibrary testLibrary = TestLibrary.INSTANCE;
final TestLibrary.ExampleCallbackImpl callback = new TestLibrary.ExampleCallbackImpl();
testLibrary.example_triggerCallback(callback, "testiddy test test");
}
}
No i okazuje się, że funkcja w C example_triggerCallback owszem jest wywoływana, bo w konsoli dostaję informację z linijki printf("provided str: %s", str); Problem pojawia się, przy wywołaniu wskaźnika na funkcję z podanym argumentem const char* str (który po stronie Javy jest Stringiem). Jest on zwyczajnie pomijany. No i tutaj moje pytanie, czego brakuje mi po stronie Javy, tak aby linijka func(str); faktycznie została wywołana?