I just wanted to test Callback function example from the webpage.
https://github.com/bytedeco/javacpp#creating-callback-functions
In file foo.cpp
#include <iostream>
#include "jniFoo.h"
int main() {
JavaCPP_init(0, NULL);
try {
foo(6, 7);
} catch (std::exception &e) {
std::cout << e.what() << std::endl;
}
JavaCPP_uninit();
}
Foo.java where function foo performs
import org.bytedeco.javacpp.*;
import org.bytedeco.javacpp.annotation.*;
@Platform(include="<algorithm>")
@Namespace("std")
public class Foo {
static { Loader.load(); }
public static class Callback extends FunctionPointer {
// Loader.load() and allocate() are required only when explicitly creating an instance
static { Loader.load(); }
protected Callback() { allocate(); }
private native void allocate();
public @Name("foo") boolean call(int a, int b) throws Exception {
throw new Exception("bar " + a * b);
}
}
// We can also pass (or get) a FunctionPointer as argument to (or return value from) other functions
public static native void stable_sort(IntPointer first, IntPointer last, Callback compare);
// And to pass (or get) it as a C++ function object, annotate with @ByVal or @ByRef
public static native void sort(IntPointer first, IntPointer last, @ByVal Callback compare);
}
Building and running this sample code with these commands under Linux x86_64:
javac -cp javacpp.jar Foo.java
java -jar javacpp.jar Foo -header
g++ -I/usr/lib/jvm/java-8-oracle/include/ -I/usr/lib/jvm/java-8-oracle/include/linux/ linux-x86_64/libjniFoo.so foo.cpp -o Foo
In the third command, I got error:
/tmp/ccvrmILI.o: In function `main':
foo.cpp:(.text+0x14): undefined reference to `JavaCPP_init'
foo.cpp:(.text+0x1e): undefined reference to `onAddTwoInteger'
foo.cpp:(.text+0x23): undefined reference to `JavaCPP_uninit'
collect2: error: ld returned 1 exit status
Why do I get it?
You get the error because the library is placed before the object file at the command line.
The g++
command in the example may work somewhere but it does not work at gcc/linux-linker. The problem is the argument order in the command. If you run
g++ -I/usr/lib/jvm/java-8-oracle/include/ -I/usr/lib/jvm/java-8-oracle/include/linux/ foo.cpp linux-x86_64/libjniFoo.so -o Foo
the it will compile and link successfully.