假设我有一个静态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时,调用正常。请帮忙。
答案 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();
}