`
ninggy
  • 浏览: 112846 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java调用C++程序

阅读更多

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路径。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics