0

假设我有一个静态 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 时,调用工作正常。请帮忙。

4

1 回答 1

0

c++ 链接器没有将 DataPacker.lib 代码添加到 Command.dll 中。如果要调用函数,则必须在 Command.dll 中为 DataPacker.lib(Java 调用的全局导出函数)编写代理函数,例如 dll 代码:#include #ifdef _ cplusplus extern "C" { #endif 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();
    }
于 2013-05-30T10:53:14.257 回答