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

相关文章
|
10月前
|
jenkins Shell 测试技术
|
9月前
|
存储 Java Go
【Java】(3)8种基本数据类型的分析、数据类型转换规则、转义字符的列举
牢记类型转换规则在脑海中将编译和运行两个阶段分开,这是两个不同的阶段,不要弄混!
390 2
|
9月前
|
Java Go 开发工具
【Java】(2)Java数据类型阐述、基本数据类型的占用和范围、二进制的讲述
数据的一种表示形式。十进制表示满十进一原则。二进制表示满二进一原则。例如:十进制例如:二进制计算机在任何情况下都只能识别二进制。
467 1
|
10月前
|
安全 Java
使用Java多态性进行数据类型转换
以上示范了如何通过多态性来执行安全有效地对于Java对象间相互之间进行正确方式与场合下正确格式与条件限定内对于各个层级关系内部成员及其功能调取与应有操作处理过程,并通过 `instanceof`关键字确保了程序运行期间遵循逻辑合理并符合预设规则条件限定内正常工作流程而无需担忧潜藏风险问题出现可能带来影响结果质量问题情况存在可能。
290 12
|
10月前
|
安全 jenkins Java
Java、Python、C++支持jenkins和SonarQube(一)
Jenkins 是一个开源的 持续集成(CI)和持续交付(CD) 工具,用于自动化构建、测试和部署软件项目。它基于 Java 开发,支持跨平台运行,并拥有丰富的插件生态系统,可以灵活地扩展功能
561 5
|
10月前
|
jenkins Java Shell
Java、Python、C++支持jenkins和SonarQube(全集)
Jenkins 是一个开源的持续集成(CI)和持续交付(CD)工具,用于自动化构建、测试和部署软件项目。它基于 Java 开发,支持跨平台运行,并拥有丰富的插件生态系统,可以灵活地扩展功能
876 1
|
10月前
|
jenkins Java 持续交付
Java、Python、C++支持Jenkins和SonarQube(三)
Python与Jenkins和SonarQube
507 1
|
10月前
|
jenkins Java 测试技术
|
11月前
|
存储 缓存 算法
Java数据类型与运算符深度解析
本文深入解析Java中容易混淆的基础知识,包括八大基本数据类型(如int、Integer)、自动装箱与拆箱机制,以及运算符(如&与&&)的使用区别。通过代码示例剖析内存布局、取值范围及常见陷阱,帮助开发者写出更高效、健壮的代码,并附有面试高频问题解析,夯实基础。
|
存储 人工智能 JavaScript
Java中的数据类型转换
本文介绍了 Java 中常见的数据类型转换方法,涵盖字符串与整型、长整型、浮点型、布尔型及日期类型的相互转换,并讲解了可能出现的异常和处理方式。
398 0