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++程序主要通过JNI,包括以下步骤: 1. 编写声明native方法的Java类。 2. 使用javah生成C++头文件。 3. 编写C++源文件实现native方法。 4. 创建C++项目,生成DLL文件。 5. 将DLL与Java类放在同一...
JNI是java调用C++程序的一种实现方法,网上有一些相关的资料,但不一定能适用,这个文档我在学习JNI时综合网上资料总结的,本人亲测能够实现,希望下载的网友有什么问题多多反馈,希望对学习JNI的朋友有所帮助
在IT行业中,跨语言通信是常见的需求,尤其是在Java和C++这样...总之,Java调用C++ Web服务是一个涉及到多种技术栈的过程,包括WSDL解析、SOAP通信、跨语言数据映射等。理解这些概念并熟练应用是实现跨语言通信的关键。
总结,C++库封装JNI接口实现Java调用C++涉及的主要步骤包括:声明Java中的本地方法,生成JNI头文件,编写C++实现,编译成库,最后在Java中加载并调用。这个过程需要理解Java和C++之间的数据类型转换,以及如何在两种...
首先,Java调用C/C++程序的主要技术是通过Java Native Interface (JNI)。JNI是Java平台的一部分,允许Java代码和其他语言写的代码进行交互。它为Java程序员提供了一种方式来编写本地方法,这些本地方法可以调用由C/...
本项目涉及的"java调用C++动态链接库dll接口"是解决这种跨语言交互问题的一种方法,主要利用了Java Native Interface(JNA)这一技术。 JNA是Java平台的标准库,它允许Java代码直接调用本机库(如DLL或.so文件)的...
完整的展示了Java调用C++ API/dll示例程序. 说明如下: 1. mrSocketAPICInt是准备被java调用的API 2. mrSocketAPIJavaInt是java调用C++ api的中间层 3. mrSocketAPIJavaIntDemo是java程序,展示与C++ api如何对接
本主题聚焦于“Java调用C++动态库”,这是一个关键的技术,它允许Java应用程序利用C++编写的高效库,比如图形处理、硬件驱动或者算法实现等。这种技术主要依赖于Java Native Interface (JNI),它是Java平台标准的一...
Java调用C++类对象是一种跨语言交互技术,主要用于利用Java的平台独立性和C++的高性能。这种技术通常依赖于Java Native Interface (JNI),它允许Java代码直接调用本地(如C++)代码,反之亦然。下面我们将深入探讨...
Java调用C++ DLL文件是跨语言编程中的一个重要应用场景,特别是在既有Java代码库又有C++动态链接库的情况下。本文将详细讲解如何在Java程序中调用C++编写的DLL文件,以及一个可用的示例。 首先,理解Java与C++交互...
最后,运行Java程序,它会自动加载并调用C++的本地方法。如果一切配置正确,Java代码将成功调用到C++的函数。 在`NativeDemo+java代码`压缩包中,应该包含了Java源代码`NativeDemo.java`,以及C++源代码和VS2013...
首先,我们需要了解Java调用C++的基本步骤: 1. **创建Java类和 native 方法**:在Java类中声明一个native方法,这个方法对应于C++中的函数。例如: ```java public class NativeDemo { static { System....
标题“java调用c++生成so库”指的是在Linux环境下,通过JNI技术,Java程序可以调用预先用C++编译生成的动态链接库(.so文件)。.so文件是Linux下的动态共享对象,相当于Windows下的.DLL文件,它包含了可由多个程序...
Java调用C++编写的DLL动态链接库是跨语言交互的一种常见方式,主要利用了Java的JNI(Java Native Interface)技术。JNI允许Java代码与其他编程语言进行原生代码交互,包括C、C++等。本实例将详细讲解如何在Java项目...
标题"JAVA调用C++/C#的DLL"涉及到的技术点主要集中在Java Native Interface(JNI)上,这是一种允许Java代码与其他编程语言(如C++或C#)进行交互的标准机制。下面我们将深入探讨这一主题。 首先,JNI是Java平台的...
Java调用C++ DLL的步骤可以分为以下几个关键部分: 1. **编写C++ DLL**: 首先,你需要在C++环境中编写函数并将其打包到一个DLL中。DLL是一个可被多个程序共享的库,包含可执行代码和数据。在C++代码中,定义那些你...
在Java中,调用C++函数并处理返回的二维数组: ```java int[][] input = ...; // 初始化输入数组 int[][] output = new int[height][width]; // 预分配输出数组 int result = myDll.processArray(input, output); `...
利用JNI技术实现Java中调用C++编写的函数库示例程序源码,并附上参考JNI文档。 详情见本人博客:Java学习之通过JNI调用C/C++编写的dll链接库(图文教程)(http://write.blog.csdn.net/postlist)
这个项目"myEclipse java调用c++动态链接库实现人脸识别所有工程"正是这种需求的一个实例,它利用了Java的JNI(Java Native Interface)技术来调用C++编译的动态链接库(DLL),从而实现人脸识别功能。以下将详细...
本篇将详细讲解如何通过Java调用C++编写的DLL(动态链接库)。 标题中的"JAVA调用C++编写的DLL"涉及到的主要技术点是JNI(Java Native Interface),这是Java平台提供的一种机制,允许Java代码和其他语言写的代码...