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

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

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

相关文章
|
9天前
|
存储 Java 程序员
揭秘!Java数据类型背后的“黑科技”
【6月更文挑战第13天】Java编程中的数据类型是构建程序的基础,分为基本数据类型(如整型、浮点型、字符型、布尔型)和引用数据类型(类、接口、数组)。内存管理通过垃圾回收自动化,减少错误风险。数据类型间支持自动和强制转换,但需注意精度和溢出。封装类(如Integer、Double)提供额外功能,使使用更灵活。示例代码展示了类型转换和封装类的运用。Java的数据类型设计确保了灵活性和效率,为编写高质量程序奠定基础。
|
9天前
|
存储 算法 Java
我与Java数据类型的那场“风花雪月”
【6月更文挑战第13天】在Java编程之旅中,作者通过探索数据类型,体验了编程的韵律与美感。从整数类型(byte, short, int, long)到浮点类型(float, double),再到独特的字符(char)和布尔(boolean)类型,每种数据类型都在内存中占据特定空间,并影响着程序设计。深入理解这些数据类型,使作者更精通Java,能编写出高效优雅的代码,进一步揭示了编程世界的广阔前景。
|
9天前
|
存储 自然语言处理 Java
Java数据类型:为何它如此“撩人”?
【6月更文挑战第13天】Java数据类型精准灵活,如整型(byte, short, int, long)满足不同需求,节约内存;浮点型(float, double)兼顾精度与速度,适合科学计算;独特的char类型用2字节支持Unicode,处理多语言文本;布尔型(boolean)简洁实用,助力逻辑表达。这些优势使Java数据类型在编程领域备受青睐。
|
9天前
|
Java
当Java数据类型遇上“爱情”,会擦出怎样的火花?
【6月更文挑战第13天】Java数据类型在编程中遇见“爱情”,通过初始化、类型转换、引用类型及异常处理展现情感历程。代码示例包括变量的甜蜜相遇(如`int loveLevel = 0`),类型转换的磨合,引用类型的深情表达(如Lover类),以及异常处理带来的爱情考验。这些示例展示了Java在表达抽象概念时的多样性和灵活性。
|
9天前
|
存储 Java 开发者
Java数据类型:从入门到精通,你不得不看的“宝典”
【6月更文挑战第13天】Java凭借其跨平台能力和丰富的类库深受开发者喜爱。学习Java首先需掌握数据类型,包括基本类型(整型、浮点型、字符型、布尔型)和引用类型(类、接口、数组)。基本类型占用固定内存,值不可变;引用类型存储对象地址。通过示例代码展示了如何声明和使用这些类型。此外,Java的封装类如Integer等提供了操作便利。理解数据类型对于程序设计至关重要,是进一步学习Java高级特性的基础。开始你的Java编程之旅,不断实践,你将在Java世界中不断进步。
|
2天前
|
Java
杨老师课堂_Java教程第六篇之引用数据类型_类的运用
杨老师课堂_Java教程第六篇之引用数据类型_类的运用
5 1
|
9天前
|
Java 程序员
Java数据类型:为什么程序员都爱它?
【6月更文挑战第13天】Java编程语言因其强大的功能和广泛应用深受程序员喜爱,尤其在数据类型方面表现出色。它提供8种基本数据类型,确保精确、高效,如金融系统中使用`double`类型保证账户余额计算精度。此外,Java的引用数据类型如类、接口、数组提供灵活的数据结构,如在电商系统中创建Order类表示复杂订单信息。因此,Java数据类型在简单运算和处理复杂数据时都展现出强大支撑,合理选用对程序质量与性能至关重要。
|
8天前
|
Java 程序员 API
[笔记] 疯狂JAVA讲义(第3版)第3章 数据类型和运算符
[笔记] 疯狂JAVA讲义(第3版)第3章 数据类型和运算符
|
1天前
|
存储 Java 关系型数据库
数据类型的取值范围以及Java和Mysql数据库的类型对照--强调时间类型的转换(jdk1.8)
数据类型的取值范围以及Java和Mysql数据库的类型对照--强调时间类型的转换(jdk1.8)
5 0
|
8天前
|
存储 消息中间件 NoSQL
使用 Java 操作 Redis 数据类型的详解指南
使用 Java 操作 Redis 数据类型的详解指南
7 0