无法从Java类调用静态库函数

时间:2013-05-30 07:21:17

标签: java c++

假设我有一个静态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获得了异常,

  

“本机代码库无法加载.Observer.sendToClient()V”

从DataPacker.lib移动到command.lib时,调用正常。请帮忙。

1 个答案:

答案 0 :(得分:0)

c ++链接器没有将DataPacker.lib代码添加到Command.dll中。 如果要调用函数,则必须在Command.dll for DataPacker.lib中编写代理函数(java调用的全局导出函数) 例如dll代码:         #包括         #ifdef _ cplusplus         extern“C”{         #万一         JNIEXPORT void JNICALL Java _Observer_sendToClient         (JNIEnv *,jclass,jobject);         #ifdef __cplusplus         }         #ENDIF

    //DatapackerDLL.cpp
    JNIEXPORT void JNICALL Java__Observer_sendToClient
    (JNIEnv *, jclass, jobject)
    {
     DataPacker::sendToClient();
    }