Java JNI开发时常用数据类型与C++中数据类型转换
来源:互联网 发布:数据库模糊查询sql语句 编辑:程序博客网 时间:2024/05/16 12:38
JavaJNI开发时常用数据类型与C++中数据类型转换
常见的数据类型对应关系如下:
此外我们经常用String类型,它可以通过如下的API实现jstring到char*之间的相互转换constchar* szString = env-> GetStringUTFChars(jstring, 0);这种转换出来的char*类型数据,使用完之后一定要调用
env-> ReleaseStringUTFChars(jstring, szString);释放掉,不然会导致内存泄漏,如果忘记JVM会崩溃的。从C++中创建一个新的字符串然后返回的代码如下:
// create jstringjstring 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* typeconst char* name = env->GetStringUTFChars(param, 0);printf("%s %s\n", "Hello JNI, I am ", name);// release memoryenv->ReleaseStringUTFChars(param, name);// return 0;return 0;}JNIEXPORT jstring JNICALL Java_com_gloomyfish_jnidemo_HelloJNI_getComputerName(JNIEnv *env, jobject obj) {// define the buffer sizeconst int MAX_BUFFER_LEN = 500;TCHAR infoBuf[MAX_BUFFER_LEN];DWORD bufCharCount = MAX_BUFFER_LEN;GetComputerName(infoBuf, &bufCharCount);// conver to jstringprintf("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 jstringjstring computerName = env->NewStringUTF(chRtn);return computerName;}JNIEXPORT jstring JNICALL Java_com_gloomyfish_jnidemo_HelloJNI_getUserName(JNIEnv *env, jobject obj) {// define the buffer sizeconst int MAX_BUFFER_LEN = 500;TCHAR infoBuf[MAX_BUFFER_LEN];DWORD bufCharCount = MAX_BUFFER_LEN;GetUserName(infoBuf, &bufCharCount);// conver to jstringprintf("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 jstringjstring 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
0 1
- Java JNI开发时常用数据类型与C++中数据类型转换
- Java数据类型与JNI数据类型转换
- Android中JNI使用详解(4)---Java与C之间数据类型转换
- JNI 中 JAVA 与 C 数据类型装换 (1)
- JNI 中 JAVA 与 C 数据类型装换 (2)
- JNI 中 JAVA 与 C 数据类型装换 (3)
- NDK开发 - JNI数据类型与Java数据类型映射关系
- Java 数据类型与jni数据类型对应关系
- C中数据类型转换
- C中数据类型转换
- Java 与 C 底层数据类型转换
- Java 与 C 底层数据类型转换
- Java与C底层数据类型转换
- Java 与 C 底层数据类型转换
- Java与C底层数据类型转换
- Java:java中基础数据类型与转换.
- java数据类型与转换
- JAVA数据类型与转换
- Android产品研发(二十)-->代码Review
- 移动平台驱动器模块调试笔记
- Java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addFilter
- 按键修饰符vue.js
- 该怎么导出CorelDRAW 中的网页文件
- Java JNI开发时常用数据类型与C++中数据类型转换
- 如何通过设计验证让SoC芯片流片成功
- 2. Add Two Numbers
- Android产品研发(二十二)-->Android实用调试技巧
- chrome devTools--Source面板的小功能
- BZOJ2791/POI2012 Rendezvous
- 第2课 矩阵消元
- 一些系统事件的手动触发方法
- 使用VC6.0开发COM组件 - 傻瓜式,不讲理论,只讲实例