java - C++ non static callbacks and JNA -
i trying use c++ api in java jna. api uses callbacks handle sessions events.
the resource found on how register callbacks jna this, , deals c callbacks, , don't know how can extended c++ non-static callbacks.
edit: found this resource, think "revisiting callbacks" chapter might help.
all function pointers callbacks stored in following sp_session_callbacks
structure:
/** * session callbacks * * registered when create session. * if callbacks should not of interest, set them null. */ typedef struct sp_session_callbacks { void (__stdcall *logged_in)(sp_session *session, sp_error error); void (__stdcall *logged_out)(sp_session *session); void (__stdcall *connection_error)(sp_session *session, sp_error error); void (__stdcall *message_to_user)(sp_session *session, const char *message); // other callbacks function pointers } sp_session_callbacks;
the java class created described structure following:
public class sp_session_callbacks extends structure{ public function logged_in; public function logged_out; public function connection_error; public function message_to_user; }
does make sense represent function pointers com.sun.jna.function objects in case in opinion?
each session represented sp_session
object, c++ opaque struct. have handle on sp_session_callbacks
object when initialize though.
here code snippet main class:
jlibspotify lib = (jlibspotify)native.loadlibrary("libspotify", jlibspotify.class); sp_session_config cfg = new sp_session_config(); /* cfg config here */ sp_session_callbacks sesscallbacks = new sp_session_callbacks(); // handle on sp_session_callbacks object cfg.callbacks = sesscallbacks; pointerbyreference sessionpbr = new pointerbyreference(); int errorid = lib.sessioncreate(cfg, sessionpbr); sp_session session = new sp_session(sessionpbr.getvalue()); // handle on sp_session object
how should register callbacks function on java side when triggered?
thank you!
edit
new code using callback instead of function:
public class sp_session_callbacks extends structure{ public loggedin logged_in; /* other callbacks... */ } public interface loggedin extends stdcallcallback { public void logged_in(sp_session session, int error); }
main class:
jlibspotify lib = (jlibspotify)native.loadlibrary("libspotify", jlibspotify.class); sp_session_config cfg = new sp_session_config(); /* cfg config here */ sp_session_callbacks sesscallbacks = new sp_session_callbacks(); // handle on sp_session_callbacks object loggedin loggedincallback = new loggedin(){ public void logged_in(sp_session session, int error){ system.out.println("it works"); } }; sesscallbacks.logged_in = loggedincallback; /* setting other callbacks null */ cfg.callbacks = sesscallbacks; pointerbyreference sessionpbr = new pointerbyreference(); int errorid = lib.sessioncreate(cfg, sessionpbr); sp_session session = new sp_session(sessionpbr.getvalue()); // handle on sp_session object
the sessioncreate() call throwing jre fatal error (exception_acces_violation 0x0000005) when cfg.logged_in not set null instance of loggedin. weird thing 2 callbacks logged_in , connection-error have same signature, , when cfg.connection_error set, doesn't throw anything.
from javadoc function represents native method, if want call java method have create callback each function pointer.
if use java callbacks , no native functions can replace function callback. (depending on calling convention used might want use stdcalllibrary.stdcallcallback instead)
public class sp_session_callbacks extends structure{ public stdcallcallback logged_in; public stdcallcallback logged_out; public stdcallcallback connection_error; public stdcallcallback message_to_user; } sp_session_callbacks calls = new sp_session_callbacks(); calls.logged_out = new stdcallcallback(){ public void somename(sp_session sp){...} }
Comments
Post a Comment