java jna c out_java – C非静态回调和JNA

我试图在

Java中使用JNA的C API.此API使用回调来处理会话事件.

我在如何使用JNA注册回调时找到的唯一资源是this,它处理C回调,我真的不知道它如何扩展到C非静态回调.

编辑:我刚刚找到this resource,我认为“重访回调”一章可能有所帮助.

回调的所有函数指针都存储在以下sp_session_callbacks结构中:

/**

* Session callbacks

*

* Registered when you create a session.

* If some callbacks should not be of interest, set them to 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;

我为描述这个结构而创建的Java类如下:

public class sp_session_callbacks extends Structure{

public Function logged_in;

public Function logged_out;

public Function connection_error;

public Function message_to_user;

}

在您看来,在这种情况下通过com.sun.jna.Function对象表示函数指针是否有意义?

每个会话由sp_session对象表示,该对象是C opaque结构.我在初始化时确实有sp_session_callbacks对象的句柄.

这是我的主类的代码片段:

JLibspotify lib = (JLibspotify)Native.loadLibrary("libspotify", JLibspotify.class);

sp_session_config cfg = new sp_session_config();

/* Some cfg config here */

sp_session_callbacks sessCallbacks = new sp_session_callbacks(); // Handle on my 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 my sp_session object

我应该如何注册这些回调函数,以便在它们被触发时在Java端实际执行某些操作?

谢谢!

编辑

使用Callback而不是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);

}

主要课程:

JLibspotify lib = (JLibspotify)Native.loadLibrary("libspotify", JLibspotify.class);

sp_session_config cfg = new sp_session_config();

/* Some cfg config here */

sp_session_callbacks sessCallbacks = new sp_session_callbacks(); // Handle on my 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 all the other callbacks to null */

cfg.callbacks = sessCallbacks;

PointerByReference sessionPbr = new PointerByReference();

int errorId = lib.sessionCreate(cfg, sessionPbr);

sp_session session = new sp_session(sessionPbr.getValue()); // handle on my sp_session object

当cfg.logged_in未设置为null但是设置为LoggedIn实例时,sessionCreate()调用抛出JRE致命错误(EXCEPTION_ACCES_VIOLATION 0x0000005).奇怪的是,2个回调logged_in和connection-error具有相同的签名,并且当设置cfg.connection_error时,它不会抛出任何东西.

最佳答案 从javadoc函数表示本机方法,如果要调用java方法,则必须为每个函数指针创建一个

Callback.

如果您只使用java回调而没有本机函数,则可以将Function替换为Callback. (根据使用的调用约定,您可能希望使用StdCallLibrary.StdCallCallback)

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){...}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值