`
ninggy
  • 浏览: 114230 次
  • 性别: 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路径。

分享到:
评论

相关推荐

    JAVA 调用C++程序

    总结来说,Java调用C++程序主要通过JNI,包括以下步骤: 1. 编写声明native方法的Java类。 2. 使用javah生成C++头文件。 3. 编写C++源文件实现native方法。 4. 创建C++项目,生成DLL文件。 5. 将DLL与Java类放在同一...

    JNI快速实现入门(java调用C++程序的方法)

    JNI是java调用C++程序的一种实现方法,网上有一些相关的资料,但不一定能适用,这个文档我在学习JNI时综合网上资料总结的,本人亲测能够实现,希望下载的网友有什么问题多多反馈,希望对学习JNI的朋友有所帮助

    java调用C++ webservice

    在IT行业中,跨语言通信是常见的需求,尤其是在Java和C++这样...总之,Java调用C++ Web服务是一个涉及到多种技术栈的过程,包括WSDL解析、SOAP通信、跨语言数据映射等。理解这些概念并熟练应用是实现跨语言通信的关键。

    C++库封装JNI接口-实现java调用c++

    总结,C++库封装JNI接口实现Java调用C++涉及的主要步骤包括:声明Java中的本地方法,生成JNI头文件,编写C++实现,编译成库,最后在Java中加载并调用。这个过程需要理解Java和C++之间的数据类型转换,以及如何在两种...

    java调用c c++程序实例

    首先,Java调用C/C++程序的主要技术是通过Java Native Interface (JNI)。JNI是Java平台的一部分,允许Java代码和其他语言写的代码进行交互。它为Java程序员提供了一种方式来编写本地方法,这些本地方法可以调用由C/...

    java调用C++动态链接库dll接口

    本项目涉及的"java调用C++动态链接库dll接口"是解决这种跨语言交互问题的一种方法,主要利用了Java Native Interface(JNA)这一技术。 JNA是Java平台的标准库,它允许Java代码直接调用本机库(如DLL或.so文件)的...

    Java调用C++ API/dll示例程序

    完整的展示了Java调用C++ API/dll示例程序. 说明如下: 1. mrSocketAPICInt是准备被java调用的API 2. mrSocketAPIJavaInt是java调用C++ api的中间层 3. mrSocketAPIJavaIntDemo是java程序,展示与C++ api如何对接

    Java调用C++动态库

    本主题聚焦于“Java调用C++动态库”,这是一个关键的技术,它允许Java应用程序利用C++编写的高效库,比如图形处理、硬件驱动或者算法实现等。这种技术主要依赖于Java Native Interface (JNI),它是Java平台标准的一...

    Java调用c++类对象

    Java调用C++类对象是一种跨语言交互技术,主要用于利用Java的平台独立性和C++的高性能。这种技术通常依赖于Java Native Interface (JNI),它允许Java代码直接调用本地(如C++)代码,反之亦然。下面我们将深入探讨...

    非常好用java调用c++ dll文件demo

    Java调用C++ DLL文件是跨语言编程中的一个重要应用场景,特别是在既有Java代码库又有C++动态链接库的情况下。本文将详细讲解如何在Java程序中调用C++编写的DLL文件,以及一个可用的示例。 首先,理解Java与C++交互...

    java调用C++编写的动态库dll

    最后,运行Java程序,它会自动加载并调用C++的本地方法。如果一切配置正确,Java代码将成功调用到C++的函数。 在`NativeDemo+java代码`压缩包中,应该包含了Java源代码`NativeDemo.java`,以及C++源代码和VS2013...

    JAVA调用C++demo

    首先,我们需要了解Java调用C++的基本步骤: 1. **创建Java类和 native 方法**:在Java类中声明一个native方法,这个方法对应于C++中的函数。例如: ```java public class NativeDemo { static { System....

    java调用c++生成so库

    标题“java调用c++生成so库”指的是在Linux环境下,通过JNI技术,Java程序可以调用预先用C++编译生成的动态链接库(.so文件)。.so文件是Linux下的动态共享对象,相当于Windows下的.DLL文件,它包含了可由多个程序...

    java调用C++写的dll的实例

    Java调用C++编写的DLL动态链接库是跨语言交互的一种常见方式,主要利用了Java的JNI(Java Native Interface)技术。JNI允许Java代码与其他编程语言进行原生代码交互,包括C、C++等。本实例将详细讲解如何在Java项目...

    JAVA调用C++/C#的DLL

    标题"JAVA调用C++/C#的DLL"涉及到的技术点主要集中在Java Native Interface(JNI)上,这是一种允许Java代码与其他编程语言(如C++或C#)进行交互的标准机制。下面我们将深入探讨这一主题。 首先,JNI是Java平台的...

    java调用c++ dll的示例

    Java调用C++ DLL的步骤可以分为以下几个关键部分: 1. **编写C++ DLL**: 首先,你需要在C++环境中编写函数并将其打包到一个DLL中。DLL是一个可被多个程序共享的库,包含可执行代码和数据。在C++代码中,定义那些你...

    JNA调用C++动态库,传入二维数组,通过C++返回二维数组,java调用C++完整案例

    在Java中,调用C++函数并处理返回的二维数组: ```java int[][] input = ...; // 初始化输入数组 int[][] output = new int[height][width]; // 预分配输出数组 int result = myDll.processArray(input, output); `...

    利用JNI实现Java调用C++库

    利用JNI技术实现Java中调用C++编写的函数库示例程序源码,并附上参考JNI文档。 详情见本人博客:Java学习之通过JNI调用C/C++编写的dll链接库(图文教程)(http://write.blog.csdn.net/postlist)

    myEclipse java调用c++动态链接库实现人脸识别所有工程

    这个项目"myEclipse java调用c++动态链接库实现人脸识别所有工程"正是这种需求的一个实例,它利用了Java的JNI(Java Native Interface)技术来调用C++编译的动态链接库(DLL),从而实现人脸识别功能。以下将详细...

    JAVA调用C++编写的DLL(C++和JAVA源码)

    本篇将详细讲解如何通过Java调用C++编写的DLL(动态链接库)。 标题中的"JAVA调用C++编写的DLL"涉及到的主要技术点是JNI(Java Native Interface),这是Java平台提供的一种机制,允许Java代码和其他语言写的代码...

Global site tag (gtag.js) - Google Analytics