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路径。
分享到:
相关推荐
JNI是java调用C++程序的一种实现方法,网上有一些相关的资料,但不一定能适用,这个文档我在学习JNI时综合网上资料总结的,本人亲测能够实现,希望下载的网友有什么问题多多反馈,希望对学习JNI的朋友有所帮助
JAVA如何调用 C++生成的DLL文件,内附本人亲测的详细步骤
完整的展示了Java调用C++ API/dll示例程序. 说明如下: 1. mrSocketAPICInt是准备被java调用的API 2. mrSocketAPIJavaInt是java调用C++ api的中间层 3. mrSocketAPIJavaIntDemo是java程序,展示与C++ api如何对接
java调用c c++程序实例,java用eclipse编译,c/c++用visual studio2008编译。
利用JNI技术实现Java中调用C++编写的函数库示例程序源码,并附上参考JNI文档。 详情见本人博客:Java学习之通过JNI调用C/C++编写的dll链接库(图文教程)(http://write.blog.csdn.net/postlist)
完整的展示了Java调用C++ API/dll示例程序. 说明如下: 1. mrSocketAPICInt是准备被java调用的API 2. mrSocketAPIJavaInt是java调用C++ api的中间层 3. mrSocketAPIJavaIntDemo是java程序,展示与C++ api如何对接。...
java与dll交互的技术主要有3种:jni,jawin和jacob。Jni(Java Native Interface)是sun提供的java与系统中的原生方法交互的技术(在...Jacob(Java-Com Bridge)提供了java程序调用microsoft的com对象中的方法的能力。
NULL 博文链接:https://gaojingsong.iteye.com/blog/2317392
java调用c++写的dll出现"由于应该程序配置不正确,应用程序未能启动"所用的资源
Java applet调用c++ SSO登录javascript脚本开发教程
完整的实现java跨平台调用C程序源码,包含JAVA源码和C源码以及编译后的demo dll。将dll放到jdk bin目录下,java 项目可以直接运行。若要修改dll可以,修改C源码后重新编译生成dll。该demo处理了多线程调用c,全局...
实现用C++调用Java接口的例子程序 包括一个java被调程序 一个c++主调程序
JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了...通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法。
项目有java调用c的需求,所以本人亲测做了一个程序来通过java调用c的函数。c部分用qt建立一个dll。实测通过。
该软件主要是介绍,java如何调用才c++程序,并且如何在visaul c++中用命令行cl生成dll文件。
V. Eclipse+CDT+MinGW 进行JAVA调用C/C++ 34 一、 安装eclipse3.2。 34 二、 安装MinGW。 34 1、 下载MinGW 34 2、 安装 34 3、 安装版本 34 4、 选择安装的编译器 34 5、 选择安装路径,下一步 35 6、 等待下载...
C++ 调用Java webservice接口的函数,内有个使用说明文档,很详细的
windows 下,一个java application程序调用C++动态库。亲测可行,供大家参考。
用JNI实现java和C++的相互调用,内容也就是这个,简单的入门程序,当作一个学习的开端吧
java写的程序作为服务端,windows下c++写的程序作为服务端,java端可以上传文件至windows服务端,解决了中文乱码的问题,端口和文件保存路径可自行配置,适合有需求的人参考