假设我有一个静态C++库,DataPacker.lib,并链接到一个名为Command.dll的共享动态链接库。
静态库公开以下函数,
//Datapacker.h
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT void JNICALL Java__Observer_sendToClient
(JNIEnv *, jclass, jobject);
#ifdef __cplusplus
}
#endif
//Datapacker.cpp
JNIEXPORT void JNICALL Java__Observer_sendToClient
(JNIEnv *, jclass, jobject)
{
//Print
}现在,我尝试从java类调用上面的函数,如下所示,
//Observer.Java
class Observer
{
static{
System.loadLibrary("Command");
}
public static void main(String[] args) {
try{
sendToClient();
}
catch (Throwable t){
System.err.println("Native code library failed to load.\n" + t.getMessage());
}
}
private static native void sendToClient();
}但是我从java得到了一个例外,
“本机代码库load.Observer.sendToClient()V失败”
当调用从DataPacker.lib移动到command.lib时,调用工作正常。请帮帮忙。
发布于 2013-05-30 10:53:14
c++链接器没有将DataPacker.lib代码添加到Command.dll中。如果要调用函数,必须在Command.dll for DataPacker.lib( java调用的全局导出函数)中编写代理函数,例如dll代码:#include #ifdef _cplusplus extern "C“{ #endif JNIEXPORT void Java_Observer_sendToClient (JNIEnv *,jclass,jobject);#ifdef __cplusplus } #endif __cplusplus}#endif
//DatapackerDLL.cpp
JNIEXPORT void JNICALL Java__Observer_sendToClient
(JNIEnv *, jclass, jobject)
{
DataPacker::sendToClient();
}https://stackoverflow.com/questions/16830226
复制相似问题