`

C++和JNI的数据转换(2)

阅读更多

全部的C/C++方法实现代码如下:

/**//*
*
* 一缕阳光(sundy)版权所有,保留所有权利。
*/

/**//**

*  TODO Jni 中一个从Java到C/C++参数传递测试类
*
*  @author 刘正伟(sundy)
*  @see 
http://www.cnweblog.com/sundy
*  @see mailto:sundy26@126.com
*  @version 1.0
*  @since 2005-4-30

*  修改记录:
*  
*  日期              修改人                 描述
*  ----------------------------------------------------------------------------------------------
*
*
*
*/

// JniManage.cpp : 定义 DLL 应用程序的入口点。
//
package com.sundy.jnidemo;
#include 
"stdafx.h"

#include 
<stdio.h>
#include 
<math.h>
#include 
"jni.h"
#include 
"jni_md.h"

#include 
"./head/Base.h"
#include 
"head/wmi.h"
#include 
"head/com_sundy_jnidemo_ChangeMethodFromJni.h" //通过javah –jni javactransfer 生成
#include <stdio.h>
#include 
"stdlib.h"
#include 
"string.h"

#pragma comment (lib,
"BaseInfo.lib")
#pragma comment (lib,
"jvm.lib")
//硬盘信息
struct  {
    
char name[256];
    
int serial;
}
DiskInfo;
/**//*BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
    LPTSTR  strName = new CHAR[256] ;
    (*GetHostName)(strName);
    printf("%s\n",strName);
    delete [] strName;

    return TRUE;
}
*/

//将jstring类型转换成windows类型
char* jstringToWindows( JNIEnv *env, jstring jstr );
//将windows类型转换成jstring类型
jstring WindowsTojstring( JNIEnv* env, char* str );

//主函数
BOOL WINAPI DllMain(HANDLE hHandle, DWORD dwReason, LPVOID lpReserved)
{
    
return TRUE;
}

//输入常用的数值类型 Boolean,Byte,Char,Short,Int,Float,Double
JNIEXPORT void JNICALL Java_com_sundy_jnidemo_ChangeMethodFromJni_displayParms
(JNIEnv 
*env, jobject obj, jstring s, jint i, jboolean b)
{
    
const char* szStr = (env)->GetStringUTFChars(s, 0 );
    printf( 
"String = [%s]\n", szStr );
    printf( 
"int = %d\n", i );
    printf( 
"boolean = %s\n", (b==JNI_TRUE ? "true" : "false") );
    (env)
->ReleaseStringUTFChars(s, szStr );
}


//调用一个静态方法,只有一个简单类型输出
JNIEXPORT jint JNICALL Java_com_sundy_jnidemo_ChangeMethodFromJni_add
(JNIEnv 
*env, jobject, jint a, jint b)
{
    
int rtn = (int)(a + b);
    
return (jint)rtn;
}


/**/////输入一个数组,这里输入的是一个Boolean类型的数组
JNIEXPORT void JNICALL Java_com_sundy_jnidemo_ChangeMethodFromJni_setArray
(JNIEnv 
*env, jobject, jbooleanArray ba)
{
    jboolean
* pba = (env)->GetBooleanArrayElements(ba, 0 );
    jsize len 
= (env)->GetArrayLength(ba);
    
int i=0;
    
// change even array elements
    for( i=0; i < len; i+=2 )
    
{
        pba[i] 
= JNI_FALSE;
        printf( 
"boolean = %s\n", (pba[i]==JNI_TRUE ? "true" : "false") );
    }

    (env)
->ReleaseBooleanArrayElements(ba, pba, 0 );
}


/**/////返回一个字符串数组
JNIEXPORT jobjectArray JNICALL Java_com_sundy_jnidemo_ChangeMethodFromJni_getStringArray
(JNIEnv 
*env, jobject)
{
    jstring      str;
    jobjectArray args 
= 0;
    jsize        len 
= 5;
    
char*        sa[] = "Hello,""world!""JNI""is""fun" };
    
int          i=0;
    args 
= (env)->NewObjectArray(len,(env)->FindClass("java/lang/String"),0);
    
for( i=0; i < len; i++ )
    
{
        str 
= (env)->NewStringUTF(sa[i] );
        (env)
->SetObjectArrayElement(args, i, str);
    }

    
return args;
}


//返回一个结构,这里返回一个硬盘信息的简单结构类型
JNIEXPORT jobject JNICALL Java_com_sundy_jnidemo_ChangeMethodFromJni_getStruct
(JNIEnv 
*env, jobject obj)
{
    
/**//* 下面为获取到Java中对应的实例类中的变量*/

    
//获取Java中的实例类
    jclass objectClass = (env)->FindClass("com/sundy/jnidemo/DiskInfo");

    
//获取类中每一个变量的定义
    
//名字
    jfieldID str = (env)->GetFieldID(objectClass,"name","Ljava/lang/String;");
    
//序列号
    jfieldID ival = (env)->GetFieldID(objectClass,"serial","I");


    
//给每一个实例的变量付值
    (env)->SetObjectField(obj,str,(env)->NewStringUTF("my name is D:"));
    (env)
->SetShortField(obj,ival,10);
    
    
return obj;
}


//返回一个结构数组,返回一个硬盘信息的结构数组
JNIEXPORT jobjectArray JNICALL Java_com_sundy_jnidemo_ChangeMethodFromJni_getStructArray
(JNIEnv 
*env, jobject _obj)
{
    
//申明一个object数组 
    jobjectArray args = 0;
    
    
//数组大小
    jsize        len = 5;

    
//获取object所属类,一般为ava/lang/Object就可以了
    jclass objClass = (env)->FindClass("java/lang/Object");

    
//新建object数组
    args = (env)->NewObjectArray(len, objClass, 0);

    
/**//* 下面为获取到Java中对应的实例类中的变量*/

    
//获取Java中的实例类
    jclass objectClass = (env)->FindClass("com/sundy/jnidemo/DiskInfo");
    
    
//获取类中每一个变量的定义
    
//名字
    jfieldID str = (env)->GetFieldID(objectClass,"name","Ljava/lang/String;");
    
//序列号
    jfieldID ival = (env)->GetFieldID(objectClass,"serial","I");

    
//给每一个实例的变量付值,并且将实例作为一个object,添加到objcet数组中
    for(int  i=0; i < len; i++ )
    
{
        
//给每一个实例的变量付值
        jstring jstr = WindowsTojstring(env,"我的磁盘名字是 D:");
        
//(env)->SetObjectField(_obj,str,(env)->NewStringUTF("my name is D:"));
        (env)->SetObjectField(_obj,str,jstr);
        (env)
->SetShortField(_obj,ival,10);

        
//添加到objcet数组中
        (env)->SetObjectArrayElement(args, i, _obj);
    }

    
//返回object数组
    return args;

 }


//将jstring类型转换成windows类型
char* jstringToWindows( JNIEnv  *env, jstring jstr )
{
    
int length = (env)->GetStringLength(jstr );
    
const jchar* jcstr = (env)->GetStringChars(jstr, 0 );
    
char* rtn = (char*)malloc( length*2+1 );
    
int size = 0;
    size 
= WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)jcstr, length, rtn,(length*2+1), NULL, NULL );
    
if( size <= 0 )
        
return NULL;
    (env)
->ReleaseStringChars(jstr, jcstr );
    rtn[size] 
= 0;
    
return rtn;
}

//将windows类型转换成jstring类型
jstring WindowsTojstring( JNIEnv* env, char* str )
{
    jstring rtn 
= 0;
    
int slen = strlen(str);
    unsigned 
short * buffer = 0;
    
if( slen == 0 )
        rtn 
= (env)->NewStringUTF(str ); 
    
else
    
{
        
int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0 );
        buffer 
= (unsigned short *)malloc( length*2 + 1 );
        
if( MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer, length ) >0 )
            rtn 
= (env)->NewString(  (jchar*)buffer, length );
    }

    
if( buffer )
        free( buffer );
    
return rtn;
}

分享到:
评论

相关推荐

    java jni c++ 类型转换

    java jni 与 c++ 数据类型转换 及调用

    Jni 项目 包含各种数据类型转换

    通过jni 用java调用c/c++ 编译的 dll 动态库 帖子地址 https://blog.csdn.net/qq_38777624/article/details/114625668

    java与c++交互(JNI学习笔记)

    1.C++与java交互基本介绍 2.C++获取java属性值、设置java属性值 3.C++创建java对象 4.C++中数据类型间的转换

    JNI完全技术手册 带完整书签

    Chap7:Jni中C++和Java的参数传递... 33 Chap8:如何将java传递过来的jbyteArray转换成C/C++中的BYTE数组... 47 Chap5:使用JNI技术实现java程序调用第三方dll(c/c++)文件的功能... 47 Chap9:如何编写jni方法(转载...

    JNI技术手册 c/c++调用java

    2) 如何将java传入的String参数转换为c的char*,然后使用? 57 3) 将c中获取的一个char*的buffer传递给java? 57 4) 不知道占用多少空间的buffer,如何传递出去呢? 58 五、 对JAVA传入数据的处理 58 1) 如果传入的是...

    JNI技术相关的三个Demo

    三个Demo分别演示了Java调用C/C++;C/C++调用Java;JNI技术数据类型转换和访问相关的技术。希望对初学者有帮助。

    C_Java_Transfer.zip

    通过JNI实现CC++中结构体和Java类之间的数据转换,该代码列举了两种常见的方法,学会了这两种方法,妈妈再也不要为我担心了。

    Cocos2d-x与Android交互(c++与java互调),与IOS交互(c++与objective c混编)

    Cocos2d-x与Android交互(c++与java互调),与IOS交互(c++与objective c混编) 具体的代码请下载这个文件,里面有更详细的jni使用方法,包括传递基本数据类型,返回基本数据类型的值,及类型的转换。

    Android将camera获取到的YuvData在jni中转化为Mat方法

    为了达到实时处理的目的,很多时候我们将得到的yuv数据直接传入jni中的c++使用,减少上层转化图像格式的过程yuv420本身属于单通道图像,若图像处理中只需要获取灰度图像,可以在c++中直接通过Mat构造函数构造生成...

    jni编译zinnia手写识别库

    zinnia是一个开源的手写识别库。采用C++实现。具有手写识别,学习以及文字模型数据制作转换等功能。

    基于OpenCV传统图像处理实现的美颜算法相机C源码+sln及说明(可美白和磨皮).zip

    4. 提供C++、纯C、JNI接口 5. 特点:高性能,算法本身就是基于yuv的原地操作。没有与rgb的转换和内存的拷贝。 二. 算法流程 1. 计算和与平方和的积分图 2. 局部均方差滤波 + 美白 + 皮肤检测 3. 锐化均方差滤波...

    ICTCLAS50_Windows_32_C

     ICTCLAS 2011 c/c++/c#版、JNI版均支持多线程调用。 3、支持UTF-8  以往版本需要进行编码转换,统一转换成GB2312之后才能做进一步处理。系统当前版本支持GB2312、GBK、GB18030、UTF-8、BIG5。以上编码无需做任何...

    vc++6.0 程序设计学与用教程

    3.7 各类型数据间的优先关系和相互转换 第4章 运算符与表达式 4.1 算术运算符 4.2 关系运算符 4.3 布尔逻辑运算符 4.4 位运算符 4.5 赋值运算符 4.6 字符串运算符 4.7 扩展赋值运算符 4.8 条件运算符 ...

    Thinking in Java 中文第四版+习题答案

    13.19.2 方便的转换 13.19.3 显示框架 13.19.4 工具提示 13.19.5 边框 13.19.6 按钮 13.19.7 按钮组 13.19.8 图标 13.19.9 菜单 13.19.10 弹出式菜单 13.19.11 列表框和组合框 13.19.12 滑杆和进度指示条 13.19.13 ...

    【文献综述】基于JAVA的俄罗斯方块游戏设计与实现.pdf

    甲骨文公司对于 Java 的许可是"全兼容的" ,这也导致了微软和升阳关于微软的程序不 支持 RMI 和 JNI 接口、并且增加特性为己所用的法律争端。升阳最终赢得了官司,获得了大 约两千万美元的赔偿,法院强制要求微软...

    javabiginteger源码-quickandroid:适用于Android的QML主题和组件库

    数据类型之间的自动转换。 无需在 JNI 中编写。 主题/风格引擎 一个全局主题对象。 为所有组件设置一次。 帮助函数来创建您自己的派生样式。 “Apache 许可证” - 免费用于商业应用 系统要求 Qt 5.4 或以上 用户界面...

    Think in Java(中文版)chm格式

    13.19.2 方便的转换 13.19.3 显示框架 13.19.4 工具提示 13.19.5 边框 13.19.6 按钮 13.19.7 按钮组 13.19.8 图标 13.19.9 菜单 13.19.10 弹出式菜单 13.19.11 列表框和组合框 13.19.12 滑杆和进度指示条 ...

    Java初学者入门教学

    13.19.2 方便的转换 13.19.3 显示框架 13.19.4 工具提示 13.19.5 边框 13.19.6 按钮 13.19.7 按钮组 13.19.8 图标 13.19.9 菜单 13.19.10 弹出式菜单 13.19.11 列表框和组合框 13.19.12 滑杆和进度指示条 13.19.13 ...

    JAVA_Thinking in Java

    13.19.2 方便的转换 13.19.3 显示框架 13.19.4 工具提示 13.19.5 边框 13.19.6 按钮 13.19.7 按钮组 13.19.8 图标 13.19.9 菜单 13.19.10 弹出式菜单 13.19.11 列表框和组合框 13.19.12 滑杆和进度指示条 13.19.13 ...

    JRTE:适用于 Android 和 CFW PS3 系统的 Java 实时修改

    JRTE - Java 实时编辑 [Android 和 CFW PS3 系统的 Java 实时修改] 这是针对 Java 实时模组的开发。 将 PS3 上的实时修改应用到便携式设备,例如 ... 需要做什么:Java 到 C++ 数据类型和 Visa-Versa 的 JNI 转换

Global site tag (gtag.js) - Google Analytics