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

相关文章
|
7月前
|
jenkins Shell 测试技术
|
6月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
7月前
|
消息中间件 人工智能 Java
抖音微信爆款小游戏大全:免费休闲/竞技/益智/PHP+Java全筏开源开发
本文基于2025年最新行业数据,深入解析抖音/微信爆款小游戏的开发逻辑,重点讲解PHP+Java双引擎架构实战,涵盖技术选型、架构设计、性能优化与开源生态,提供完整开源工具链,助力开发者从理论到落地打造高留存、高并发的小游戏产品。
|
7月前
|
jenkins Java Shell
Java、Python、C++支持jenkins和SonarQube(全集)
Jenkins 是一个开源的持续集成(CI)和持续交付(CD)工具,用于自动化构建、测试和部署软件项目。它基于 Java 开发,支持跨平台运行,并拥有丰富的插件生态系统,可以灵活地扩展功能
605 1
|
7月前
|
jenkins Java 持续交付
Java、Python、C++支持Jenkins和SonarQube(三)
Python与Jenkins和SonarQube
319 1
|
7月前
|
jenkins Java 测试技术
|
7月前
|
存储 Java 关系型数据库
Java 项目实战基于面向对象思想的汽车租赁系统开发实例 汽车租赁系统 Java 面向对象项目实战
本文介绍基于Java面向对象编程的汽车租赁系统技术方案与应用实例,涵盖系统功能需求分析、类设计、数据库设计及具体代码实现,帮助开发者掌握Java在实际项目中的应用。
270 0
|
Java 编译器 C++
Java开发和C++开发有什么区别
Java开发和C++开发有什么区别
|
存储 Java 编译器
java和c++的主要区别、各自的优缺点分析、java跨平台的原理的深度解析
java和c++的主要区别、各自的优缺点分析、java跨平台的原理的深度解析
1666 0
|
10月前
|
算法 Java 数据库连接
Java 与 C++ 区别深入剖析及应用实例详解
本文深入剖析了Java和C++两种编程语言的区别,从编译与执行机制、面向对象特性、数据类型与变量、内存管理、异常处理等方面进行对比,并结合游戏开发、企业级应用开发、操作系统与嵌入式开发等实际场景分析其特点。Java以跨平台性强、自动内存管理著称,适合企业级应用;C++则因高性能和对硬件的直接访问能力,在游戏引擎和嵌入式系统中占据优势。开发者可根据项目需求选择合适语言,提升开发效率与软件质量。附面试资料链接:[点此获取](https://pan.quark.cn/s/4459235fee85)。
814 0