java调用c以及c++程序采用的是JNI技术。
1.编写java程序:
package com.strong.jni;
public class DVRCpp {
public native boolean setEncoderChannelName(String enIPAddr, String enusername, String enpassword, String channelName, int channelID);
static {
try {
System.out.println(System.getProperty("java.library.path"));
System.loadLibrary("DVRStrong");
} catch (UnsatisfiedLinkError e) {
System.err.println("Can't find library DVRStrong.dll");
System.exit(-1);
}
}
}
2.编译DVRCpp.java成生class文件,在命令行中输入 javah -jni com.strong.DVRCpp.复制com_strong_jni_DVRCpp.h头文件到c++工程中,注:把头文件中的#include <jin.h>改为 "jni.h".
3.在c++工程中添加一个com_strong_jni_DVRCpp.cpp文件:
#include "DvrStrong.h"
#include <iostream>
#include <Windows.h>
#include "com_strong_jni_DVRCpp.h"
//这段代码使用来处理中文参数乱码问题
char* jstringToWindows(JNIEnv* env, jstring jstr)
{
int length = env-> GetStringLength(jstr);
const jchar* jcstr = env-> GetStringChars(jstr, 0);
char* rtn = (char*)malloc(length * 2 + 1);
int size = 0;
size = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)jcstr, length, rtn, (length*2+1), NULL, NULL);
if(size <= 0)
return NULL;
env-> ReleaseStringChars(jstr, jcstr);
rtn[size] = 0;
return rtn;
}
JNIEXPORT jboolean JNICALL Java_com_strong_jni_DVRCpp_setEncoderChannelName
(JNIEnv *env, jobject obj, jstring ip, jstring user, jstring pwd, jstring cName, jint channelID)
{
InitNetSDK();
char *enIP = NULL;
char *enUser=NULL;
char *enPwd=NULL;
WORD wDVRPort=37777;
jboolean success = false;
char *channelName = NULL;
//channelName = ( char *)env->GetStringUTFChars(cName, NULL);//中文乱码
channelName = ( char *)jstringToWindows( env, cName );
std::cout<<channelName<<std::endl;
enIP = ( char *)env->GetStringUTFChars(ip, NULL);
enUser = ( char *)env->GetStringUTFChars(user, NULL);
enPwd = ( char *)env->GetStringUTFChars(pwd, NULL);
unsigned long lLogin;
lLogin = login(enIP,wDVRPort,enUser,enPwd);
if(lLogin != 0)
{
success = SetEncoderChannleName(lLogin,channelName,channelID);
}
env->ReleaseStringUTFChars(cName,channelName);
env->ReleaseStringUTFChars(ip,enIP);
env->ReleaseStringUTFChars(user,enUser);
env->ReleaseStringUTFChars(pwd,enPwd);
DisConnect(lLogin);
CLIENT_Cleanup();
return success;
}
4.编译c++工程生成dll文件.如果提示jni.h和jni_md.h错误,这两文件在jdk的安装路径include路径和include/win32下,如果是linux则是include/linux。
5.把生成的dll文件放到java工程的library路径下,可以用System.getProperty("java.library.path"),查看library路径。