Java调用C# DLL
由于项目需要,利用了短信猫,但是一个短信猫会加载多个串口,而只需要其AT口,通过java代码,获取其AT口对应的串口号比较困难,于是通过C#获取,这里直接调用C#生成的DLL,但java不能直接调用C#生成的DLL,需要用C++作为桥接,这里介绍一种方法调用C#所生成的DLL文件。
开发环境为:Myeclipse10.0
VS2010
1.首先创建一个Java文件,命名为TestJNI,代码如下:
package msg;
public class TestJNI {
public native string GetATComNumber();
static {
System.loadLibrary("CPP");
}
public static void main(String[] args) {
TestJNI t = new TestJNI();
String data=t.GetATComNumber();
for(string s:data)
System.out.println(s);
}
}
然后利用javac对该java文件进行编译,然后利用javah命令生成对应的.h文件,注意这里的路径很重要,直接在工程的src路径下,利用包名对java文件进行编译,利用javah文件也是如此。这里会生成一个对应的h文件,留着备用
2.写相应的C#代码,创建一个C#类库,代码如下:
namespace GetAtComNumberArrays
{
public class ATCOMS
{
public ATCOMS()
{
data = MulGetHardwareInfo(HardwareEnum.Win32_PnPEntity, "Name");
}
public string data;
/// <summary>
/// 枚举win32 api
/// </summary>
public enum HardwareEnum
{
Win32_PnPEntity, // 所有设备
}
public string MulGetHardwareInfo(HardwareEnum hardType, string propkey)
{
List<string> strs = new List<string>();
StringBuilder data = new StringBuilder();
try
{
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("select *from " + hardType))
{
var hardInfos = searcher.Get();
foreach (var hardInfo in hardInfos)
{
if (hardInfo.Properties[propkey].Value.ToString().Contains("COM"))
{
strs.Add(hardInfo.Properties[propkey].Value.ToString());
}
}
searcher.Dispose();
}
string[] datatemps = strs.ToArray();
foreach (string datastring in datatemps)
{
if (datastring.Contains("AT"))
{
int index = datastring.IndexOf('(');
);
)
temp = temp.Substring(, ) + "*";
else
temp = temp.Substring(, ) + "*";
data.Append(temp);
}
}
return data.ToString();
}
catch
{
return null;
}
finally
{
data = null;
}
}
}
}
然后生成对应的DLL文件
3.创建一个C++DLL(新建->Win32项目->DLL) 然后将在1和2步骤中生成的.h文件和DLL文件考入项目中(和.cpp一个目录),代码如下:
#include "stdafx.h"
#include "jni.h"
#include "jni_md.h"
#include "com_raycom_tools_SerialPortTools.h"
#include "string.h"
#include <malloc.h>
#include <stdlib.h>
#include <vcclr.h>
#using "GetAtComNumberArrays.dll"
using namespace GetAtComNumberArrays;
#using "mscorlib.dll"
#using "System.dll"
#using "System.Web.dll"
#using "System.Web.Services.dll"
#using "MessageCenter.dll"
using namespace System;
using namespace System::Text;
using namespace System::Web;
using namespace System::Web::Services;
using namespace System::ComponentModel;
using namespace MessageCenter;
// char* To jstring
jstring stringTojstring(JNIEnv* env, const char* pat)
{
jclass strClass = env->FindClass("Ljava/lang/String;");
jmethodID ctorID = env->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");
jbyteArray bytes = env->NewByteArray(strlen(pat));
env->SetByteArrayRegion(bytes, , strlen(pat), (jbyte*)pat);
jstring encoding = env->NewStringUTF("utf-8");
return (jstring)env->NewObject(strClass, ctorID, bytes, encoding);
}
// String To jstring
jstring strTojstring(JNIEnv* env, String^ rtn)
{
pin_ptr<const wchar_t> wch = PtrToStringChars(rtn);
size_t convertedChars = ;
size_t sizeInBytes = ((rtn->Length + ) * );
char *ch = (char *)malloc(sizeInBytes);
errno_t err = wcstombs_s(&convertedChars,
ch, sizeInBytes,
wch, sizeInBytes);
jstring js = stringTojstring(env, ch);
free(ch);
return js;
}
JNIEXPORT jstring JNICALL Java_com_raycom_tools_SerialPortTools_getATComNumber
(JNIEnv *env, jobject)
{
ATCOMS ^temp=gcnew ATCOMS();
return strTojstring(env,temp->data);
}
由于这里要返回值为String,所以要进行相应的转换,转换函数已经给出,出处为:http://7wolfs.iteye.com/blog/2043835
编译的时候需要jni.h和jni_md.h,在jdk下搜索,找出这两个文件,在VS的安装目录下找出MessageCenter.dll,Interop.RTXSAPILib.dll,将其拷入C++文件中(目录为.CPP相同目录)
编译时将.h文件中的 #include <jni.h>改成#include "jni.h"
这里还要将C++的属性进行修改:选择《项目》-> 《属性页》->《配置属性》->《常规》->《公共语言运行库支持》,选择公共语言运行库支持(/clr)
然后生成DLL.
4.将生成的C++DLL文件和C#生成的DLL文件都拷入myeclipse自带JDK的bin目录下,注意是myeclipse自带JDK的bin目录下,我的目录为:C:\Users\more\AppData\Local\MyEclipse Professional 2014\binary\com.sun.java.jdk7.win32.x86_1.7.0.u45\bin
然后运行TestJNI得到结果。
如有问题,请留言。
Java调用C# DLL的更多相关文章
- Java调用第三方dll文件的使用方法 System.load()或System.loadLibrary()
Java调用第三方dll文件的使用方法 public class OtherAdapter { static { //System.loadLibrary("Connector") ...
- paip.java 调用c++ dll so总结
paip.java 调用c++ dll so总结 ///////JNA (这个ms sun 的) 我目前正做着一个相关的项目,说白了JNA就是JNI的替代品,以前用JNI需要编译一层中间库,现在JNA ...
- 巧用C#做中间语言 实现Java调用.net DLL
本文将详细为大家介绍一个java调用.net DLL的方法,以实现特殊的客户的特殊要求:“在Java项目中必须使用其提供的用.net写的DLL加密机制!” 环境与工具: ◆.net framework ...
- [JNI] Java 调用 C++ dll
首先介绍一下JNI吧! JNI 是Java提供的一个用于调用本地接口的接口层,位于Java代码 和 本地代码之间的一层:主要功能是 数据类型的转换,还有就是通过这一层来调用本地代码! 下面就说说Jav ...
- java调用C++ DLL库方法
最近一个项目要开发网页端人脸识别项目,人脸识别的算法已经写好,是C++版,但是网页端要求使用Java后台,这就涉及到Java调用DLL的问题.经过查找,实现了一个简单的例子. 1.第一步,先在Java ...
- java调用c#dll文件配置
1 在强大的c#语言和java语言之间,二者难免会因为某些特殊的要求会相互调用. 下面就以java调用c#的dll为例做详细介绍 1 在vs中的环境设置如下图,图片中程序仅作为讲解程序,在项目编译成 ...
- java调用c++ dll出现中文乱码
近期的开发用到了使用java调用本机动态连接库的功能,将文件路径通过java调用C++代码对文件进行操作. 在调用中假设路径中包括有中文字符就会出现故障.程序执行就会中止. 以下用一个小样例,来说明记 ...
- JAVA调用动态链接库(dll)
菜鸡爬坑 基础知识 因为某个东西的keygen我只会在win下生成!! 所以只能出此下策!!之前一直是android下用jni调用so文件,现在试下java在win平台下调用dll 首先还是 ...
- JAVA调用动态链接库DLL之JNative学习
package com.ehfscliax; import java.io.UnsupportedEncodingException;import java.net.URLEncoder;import ...
随机推荐
- JS框架设计读书笔记之-动画
基础概念 CSS样式可分为两种,一种值接近无限的集合(color,width),一种值只有几种(display),可以进行计算的样式,产生了动画效果.\ 1. 动画的第一步是获得元素的精确样式值. 2 ...
- 压缩感知重构算法之子空间追踪(SP)
SP的提出时间比CoSaMP提出时间稍晚一些,但和压缩采样匹配追踪(CoSaMP)的方法几乎是一样的.SP与CoSaMP主要区别在于“In each iteration, in the SP algo ...
- Maven 设置Maven源/镜像
在Eclipse/ InteliJ Idea使用Maven时,企业提供的本地仓库经常有些Jar包下载不下来,所以.配置Maven设置国内镜像对开发人员来说是必不可少的.今天写一篇自己配制的Maven镜 ...
- SpringMVC自定义配置消息转换器踩坑总结
问题描述 最近在开发时候碰到一个问题,springmvc页面向后台传数据的时候,通常我是这样处理的,在前台把数据打成一个json,在后台接口中使用@requestbody定义一个对象来接收,但是这次数 ...
- c++学习笔记---04---从另一个小程序接着说
从另一个小程序接着说 文件I/O 前边我们已经给大家简单介绍和演示过C和C++在终端I/O处理上的异同点. 现在我们接着来研究文件I/O. 编程任务:编写一个文件复制程序,功能实现将一个文件复制到另一 ...
- Android 开发笔记___shape
shape_oval <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android= ...
- linq中怎么实现多条件关联的左右连接
linq左右连接最重要的是DefaultIfEmpty()这个方法和join之后的表中判断是否( temp != null)null,左右连接其实就是表的位置互换. 1.左连接: && ...
- eclipse中删除多余的tomcat server
在eclipse菜单中选择Window--Show View--Server--Servers,打开这个服务窗口,将多余的服务删除即可. 如果每次启动中太卡没反应,那就是服务没选择好,或是端口冲突的原 ...
- ldap数据库--ODSEE--复制协议
简单介绍一下ODSEE的复制拓扑的建立,复制协议可以通过管理界面进行创建,也可以通过命令行创建.在此之前需要了解一些复制协议的相关概念,这里针对OESEE. 1,复制角色 master(提供者,也可以 ...
- fio——IO基准测试
简介 fio是IO工具,既可以用于基准测试,也可以用于硬件的压力测试验证(stress/hardware verification). 支持13种不同的IO引擎(sync.mmap.libaio.po ...