Java JNI开发时常用数据类型与C++中数据类型转换-阿里云开发者社区

开发者社区> 贾志刚> 正文

Java JNI开发时常用数据类型与C++中数据类型转换

简介: JavaJNI开发时常用数据类型与C++中数据类型转换 常见的数据类型对应关系如下: 此外我们经常用String类型,它可以通过如下的API实现jstring到char*之间的相互转换constchar* szString = env-> GetStringUTFChars(jstring, 0);这种转换出来的char*类型数据,使用完之后一定要调用 env-> ReleaseStringUTFChars(jstring, szString);释放掉,不然会导致内存泄漏,如果忘记JVM会崩溃的。
+关注继续查看

JavaJNI开发时常用数据类型与C++中数据类型转换

常见的数据类型对应关系如下:


此外我们经常用String类型,它可以通过如下的API实现jstring到char*之间的相互转换constchar* szString = env-> GetStringUTFChars(jstring, 0);这种转换出来的char*类型数据,使用完之后一定要调用

env-> ReleaseStringUTFChars(jstring, szString);释放掉,不然会导致内存泄漏,如果忘记JVM会崩溃的。从C++中创建一个新的字符串然后返回的代码如下:

// create jstring
	jstring computerName = env->NewStringUTF(chRtn);
	return computerName;

其中chRtn是char数组类型的指针。

下面是一个Java通过JNI接口调用C++的Windows接口实现电脑名称和用户名称查询的例子,首先定义JNI接口类如下
package com.gloomyfish.jnidemo;


public class HelloJNI {
	
	public native int helloJNI(String name);
	
	public native String getComputerName();
	
	public native String getUserName();
	
	public native double calculateDistance(double x, double y);
	
	public static void main(String[] args) {
		System.loadLibrary("jnitest");
		HelloJNI happ = new HelloJNI();
		happ.helloJNI("gloomyfish");
		double sum = happ.calculateDistance(3, 4);
		String computerName = happ.getComputerName();
		String user = happ.getUserName();
		
		System.out.println("sum : " + sum);
		System.out.println("computer name : " + computerName);
		System.out.println("current user : " + user);
		System.out.println();
	}
}

C++中实现如下:

// jnitest.cpp : 定义 DLL 应用程序的导出函数。
//

#include "stdafx.h"
#include <windows.h>
#include <stdlib.h>
#include "math.h"
#include "com_gloomyfish_jnidemo_HelloJNI.h"

JNIEXPORT jint JNICALL Java_com_gloomyfish_jnidemo_HelloJNI_helloJNI
(JNIEnv *env, jobject obj, jstring param) {
	// convert java string type to c++ char* type
	const char* name = env->GetStringUTFChars(param, 0);
	printf("%s %s\n", "Hello JNI, I am ", name);
	// release memory
	env->ReleaseStringUTFChars(param, name);
	// return 0;
	return 0;
}

JNIEXPORT jstring JNICALL Java_com_gloomyfish_jnidemo_HelloJNI_getComputerName
(JNIEnv *env, jobject obj) {
	// define the buffer size
	const int MAX_BUFFER_LEN = 500;
	TCHAR  infoBuf[MAX_BUFFER_LEN];
	DWORD  bufCharCount = MAX_BUFFER_LEN;
	GetComputerName(infoBuf, &bufCharCount);

	// conver to jstring
	printf("computer name : %ls\n", infoBuf);
	int nLen = WideCharToMultiByte(CP_ACP, 0, infoBuf, -1, NULL, 0, NULL, NULL);
	char* chRtn = new char[nLen];
	WideCharToMultiByte(CP_ACP, 0, infoBuf, -1, chRtn, nLen, NULL, NULL);

	// create jstring
	jstring computerName = env->NewStringUTF(chRtn);
	return computerName;
}

JNIEXPORT jstring JNICALL Java_com_gloomyfish_jnidemo_HelloJNI_getUserName
(JNIEnv *env, jobject obj) {
	// define the buffer size
	const int MAX_BUFFER_LEN = 500;
	TCHAR  infoBuf[MAX_BUFFER_LEN];
	DWORD  bufCharCount = MAX_BUFFER_LEN;
	GetUserName(infoBuf, &bufCharCount);

	// conver to jstring
	printf("current user : %ls\n", infoBuf);
	int nLen = WideCharToMultiByte(CP_ACP, 0, infoBuf, -1, NULL, 0, NULL, NULL);   
	char* chRtn = new char[nLen];
	WideCharToMultiByte(CP_ACP, 0, infoBuf, -1, chRtn, nLen, NULL, NULL);

	// create jstring
	jstring username = env->NewStringUTF(chRtn);
	return username;
}

JNIEXPORT jdouble JNICALL Java_com_gloomyfish_jnidemo_HelloJNI_calculateDistance
(JNIEnv *env, jobject obj, jdouble x, jdouble y) {
	double cx = x;
	double cy = y;
	double sum = pow(cx, 2) + pow(cy, 2);
	return sqrt(sum);
}

运行结果如下:

其中通过命令行实现JNI头文件生成,命令如下:

javah com.gloomyfish.jnidemo.HelloJNI

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java基础-22总结登录注册IO版,数据操作流,内存操作流,打印流,标准输入输出流,转换流,随机访问流,合并流,序列化流,Properties
你需要的是什么,直接评论留言。 获取更多资源加微信公众号“Java帮帮” (是公众号,不是微信好友哦) 还有“Java帮帮”今日头条号,技术文章与新闻,每日更新,欢迎阅读 学习交流请加Java帮帮交流QQ群553841695 分享是一种美德,分享更快乐! 1:登录注册IO版本案例(掌握) 要求,对着写一遍。 cn.i
1727 0
开发指南—数据类型—Collation类型
字符集(Character Set)是一组字符符号及编码方式的组合,collation是建立在某一字符集上的字符排序规则。本文汇总了PolarDB-X支持的collation类型。
13 0
Java 中基本类型和字符串之间的转换
Java 中基本类型和字符串之间的转换 在程序开发中,我们经常需要在基本数据类型和字符串之间进行转换。 其中,基本类型转换为字符串有三种方法: 1. 使用包装类的 toString() 方法 2.
609 0
距离 Java 开发者玩转 Serverless,到底还有多远?
本文摘自 Spring Cloud Alibaba 开源项目创始团队成员方剑撰写的《深入理解 Spring Cloud 与实战》一书,主要讲述了 Java 微服务框架 Spring Boot/Cloud 这个事实标准下如何应对 FaaS 场景。
1878 0
2011年功力的德哥教你两天撸通PostgreSQL - 入门、开发、原理、管理、调优
背景 很多人抱怨我写的入门文档太少,实际上几年前做过很多入门的培训,PPT也很全,听过我讲的朋友戏称这份PPT足够出一本标准教材了(达到了380页之多)。 PostgreSQL的入门教材还有很多,书籍也很多,如果您真的钟爱我写的文章的话,那就不要错过本文了,当时是2011年,PostgreSQL社区是一个很有爱的大家庭,此为当时培训2000名PG DBA献出的公开培训。
9208 0
java转换 HTML字符实体,java特殊字符转义字符串
为什么要用转义字符串? HTML中&lt;,&gt;,&amp;等有特殊含义(&lt;,&gt;,用于链接签,&amp;用于转义),不能直接使用。这些符号是不显示在我们最终看到的网页里的,那如果我们希望在网页中显示这些符号,该怎么办呢? 这就要说到HTML转义字符串(Escape Sequence)了。 转义字符串(Escape Sequence)也称字符实体(Character Ent
2262 0
VC++常用数据类型转换
刚接触VC编程的朋友往往对许多数据类型的转换感到迷惑不解,本文将介绍一些常用数据类型的使用。我们先定义一些常见类型变量借以说明
1084 0
VC常见问题与类型转换
如果发生错误的文件是由其他的C代码文件添加进入当前工程而引起的,则Alt+F7进入当前工程的Settings,选择C/C++选项卡,从Category组合框中选中Precompiled Headers,选择Not Using Precompiled headers。
885 0
+关注
贾志刚
2004毕业于山东大学齐鲁软件学院,软件工程专业。主要专注于图像处理算法学习与研究,计算机视觉技术开发应用,深度学习在计算机视觉领域应用。两本书籍《Java数字图像处理-编程技巧与应用实践》、《OpenCV On Android编程实践》作者
252
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载