在我的jni项目中,我需要向java客户机添加事件/回调,该客户机将从本机库接收此事件。在c++中,我是这样做的:
基于对话框:
SetProcessEventCallback((ProcessEvent) KSampleDlg::OnProcessEvent, this);
void KSampleDlg::OnProcessEvent(float fPercent, float fDeviceBuffer, float fCache, double dBytesWritten, double dImageSize, KSampleBurnDlg *pDlg)
{
pDlg->SetProgress((int)fPercent, (int)fCache);
}
在控制台应用程序中,它就像
SetProcessEventCallback(OnProcess, 0);
void OnProcess(float fPercent, float fDeviceBuffer, float fCache,
double dBytesWritten, double dImageSize, void *pUserData)
{
static int nChars = 0;
g_cOutputLock.Lock();
while( (fPercent/100.0)*80 > nChars )
{
g_strBuffer += _T("*");
nChars++;
}
g_cOutputLock.UnLock();
}
设置此事件回调后,库将向给定函数激发此事件。我可以在本机lib中设置函数和回调,但我不知道如何将其发送到java应用程序。任何人都可以给我一个提示,如何处理这个与jni?
1条答案
按热度按时间f0ofjuux1#
在c++端,使用管道(2)创建一对文件描述符。然后只需在写入端写入更新,完成后关闭。
在java端,获取读取端的文件描述符(例如通过jni传递)。让java打开一个
InputStream
在/dev/fd/X
在另一个线程中读到eof。