现在调用视频的插件,是dll的,如何调用dll的方法呢?
dll的名字叫dhnetsdk.dll
dll里面有方法:
CLIENT_Init
初始化SDK, 在所有的SDK函数之前调用。
BOOL CLIENT_Init(
fDisConnect cbDisConnect,
DWORD dwUser
);
Parameters cbDisConnect
断线回调函数,回调出当前网络已经断开的设备, 对调用SDK的ClIENT_LogOut()函数主动断开的设备不回调,设置为0时禁止回调 [in]dwUser
用户数据
CallBack function
typedef void(CALLBACK *fDisConnect)(
LONG lLoginID,
char *pchDVRIP,
LONG nDVRPort,
DWORD dwUser
);我想用java调用上面的初始化方法,不知道如何调用,希望知道的帮下忙。谢谢 ,最好提供下代码。可以采用jni、jna
dll的名字叫dhnetsdk.dll
dll里面有方法:
CLIENT_Init
初始化SDK, 在所有的SDK函数之前调用。
BOOL CLIENT_Init(
fDisConnect cbDisConnect,
DWORD dwUser
);
Parameters cbDisConnect
断线回调函数,回调出当前网络已经断开的设备, 对调用SDK的ClIENT_LogOut()函数主动断开的设备不回调,设置为0时禁止回调 [in]dwUser
用户数据
CallBack function
typedef void(CALLBACK *fDisConnect)(
LONG lLoginID,
char *pchDVRIP,
LONG nDVRPort,
DWORD dwUser
);我想用java调用上面的初始化方法,不知道如何调用,希望知道的帮下忙。谢谢 ,最好提供下代码。可以采用jni、jna
2。 写JNI,你调用那个C++。
JNI调用第三方dll的一般做法
你需要在java里定义一个native方法,根据需要定义好里面的参数,然后用javah生成头文件,在C里用该头文件写个dll(这个叫第二方dll,java直接可调用的),在这个dll中去调用你的那个视频dll(这个叫第三方dll,java不直接调用的)
所以只要保证第二方dll调用第三方dll的参数类型正确即可,也就是说java和第二方dll的参数可以根据需要来定,可以和第三方dll的参数一致,也可以不一致,只要第二方dll调用第三方dll后,能把结果传给java就可以了。
static {
System.loadLibrary("mydll"); //C编译的dll
} public static void main(String[] args) {
System.out.println(init());
} public static native boolean init();
}javac Test //编译
javah Test //生成C的头文件,结果大概如下/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Test */#ifndef _Included_Test
#define _Included_Test
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Test
* Method: init
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_Test_init
(JNIEnv *, jclass);#ifdef __cplusplus
}
#endif
#endif用该头文件在C里编写相应的处理#include <stdio.h>
#include <windows.h>
#include "Test.h"
//#include some other head filetypedef bool ( *dllFp )(fDisConnect, DWORD); //定义dll接口指针JNIEXPORT jboolean JNICALL Java_Test_init
(JNIEnv *, jclass) {
HINSTANCE dllhandle;
dllFp proc; fDisConnect cbDisConnect;
DWORD dwUser; jboolean result = false; printf("loadlibrary\n");
dllhandle = LoadLibrary("dhnetsdk.dll");
printf("get dll entry\n");
proc = (dllFp) GetProcAddress(dllhandle, "CLIENT_Init");
if (proc == NULL) {
printf("%s\n", "CLIENT_Init not found");
return result;
}
//设置cbDisConnect和dwUser;
printf("call dll entry\n");
result = (jboolean)((*proc)(cbDisConnect, dwUser)); printf("free dll\n");
if (dllhandle != NULL) {
FreeLibrary (dllhandle);
} return result;
}把C编译为dll
http://topic.csdn.net/u/20110615/16/4cfa220f-7020-4551-93d0-64b7c6d88c6b.html
http://wenku.baidu.com/view/f54e781dfad6195f312ba6bc.html
http://download.csdn.net/source/2248938
{
try
{
System.loadLibrary("dhnetsdk");
}
catch (UnsatisfiedLinkError e)
{
System.loadLibrary("dhnetsdk");
}