最近在做一个Android电子词典,其中在从词库中读取词条时,用到了jni---java调用c++;在java代码里调用本地方法时,难免会java与c++之间传递参数。传递的参数若是英文的话,比较好解决,网上一般都有解决方法,用着也没问题;但是在传递中文字符串时,就需要转换一下。下面就是我自己的传递方式:
1.C++ --> java
在C++中,解压出的词条是 jbyte* 类型的,有英文,有中文,所以,我就把这些数据以byteArray的形式给传递到java里面:
//功能:把解压出的词条放入数组中
//输入:plema 解压出的词条
//输入:i 词条索引
void ADDDictListItem(JNIEnv *env, jobject obj,jbyte *plema,int i)
{
jstring str;
jbyteArray lem=env->NewByteArray(strlen((char*)plema));
env->SetByteArrayRegion(lem, 0,strlen((char*)plema), (jbyte*)plema);
(env)->SetObjectArrayElement(args, i, lem);
}
在java里面接收到 byte [] lems后,用创建一个新字符串的方式 String s=new String(lems,"GBK"),就可以得到那些传递过来的字符串。
2.java --> C++
在java向c++传递中文字符串的时候,我也是以后 byte[]的形式传递过去。先在java中把中文字符串转换成byte[]:
String str="阿姨";
byte []= str.getBytes("GBK");
在C++中:
//功能:接收从java传递过来的数组
//输入:lems java传递过来的数组
void searchZNInputLemmas(JNIEnv *env, jobject obj,jbyteArray lems)
{
jbyte * str;
str =(jbyte *) (env)->GetByteArrayElements(lems, false);
(env)->ReleaseByteArrayElements(lems, str, 0);
}
分享到:
相关推荐
这个主题表明我们将讨论一个实例,展示如何在Java和C/C++之间有效地传递中文字符。在Android中,由于字符编码的问题,中文字符在JNI层间的传递可能会遇到问题,例如乱码。因此,理解和掌握正确的编码处理方式是至关...
Android JNI(Java Native Interface)编程是Android开发中的一个重要部分,它允许Java代码和其他语言(如C/C++)编写的代码进行交互。JNI在Android平台上扮演着桥梁的角色,使得开发者能够利用C/C++的强大性能和...
注意,由于Java对象不能直接在JNI中跨线程使用,因此如果要在C/C++中存储或操作Java对象,通常需要将对象序列化为基本类型(如整数或字符串)。对于复杂的对象,可能需要自定义序列化和反序列化逻辑。 5. **内存...
在Android开发中,JNI(Java Native Interface)是一个关键的组件,它允许Java代码与其他语言(如C/C++)编写的代码进行交互。Android Studio作为官方推荐的集成开发环境,提供了对JNI的良好支持,使得开发者可以...
总结起来,Android中的JNI与`jstring`使用涉及到Java与C/C++之间的交互,包括如何获取和释放字符串的UTF-8表示,以及如何在两个环境中安全地传递数据。熟悉这些概念和操作对优化性能、利用原生库和实现特定功能至关...
1. **字符串传递**:在Java中,字符串是对象,而在C中,字符串通常表示为字符数组。在JNI中,我们使用`NewStringUTF`函数从Java字符串创建一个C的UTF-8编码的字符串,然后使用`GetStringUTFChars`获取其实际内容。在...
- JNI函数`JNIEnv`指针是Java和C++之间通信的关键,提供了各种方法来操作Java对象、数组、字符串等。 - 在C++代码中,可以通过`JNIEnv`访问Java对象,调用Java方法,或者创建新的Java对象。 5. **性能优化**: -...
通过各种示例,手册逐步引导读者了解如何在JNI中传递和返回值,包括基本数据类型、对象类型、字符串和数组等。 在深入学习如何在Java和C/C++之间传递参数的同时,本手册还介绍了JNI中的参数传递机制,特别是如何将...
总结来说,"hello-jniCallback"项目是学习Android JNI的一个好起点,它展示了如何设置回调,如何在Java和C/C++之间传递数据,以及如何在Android应用中有效地使用JNI。通过这个示例,开发者可以深入理解原生代码在...
总结起来,JNI_JAVA_C++的学习涵盖了Java与C++之间的通信机制,涉及数据传递、方法调用、字段访问等多个方面。通过实践这些示例项目,开发者可以掌握如何在两个语言间高效地协同工作,充分利用各自的优势。在移动...
本示例程序主要讲解如何在Android Studio中通过JNI进行数组的传递,从而实现Java与C/C++之间的数据交互。 首先,我们需要理解Java与C/C++的数据类型对应关系。在JNI中,Java的数组需要转换为C/C++的数据结构才能...
在Android应用开发中,JNI(Java Native Interface)是Java与本地代码交互的一种方式,它允许开发者使用C++、C等语言编写部分性能敏感或需要利用硬件特性功能的代码。本实例测试主要探讨如何通过Java接口(interface...
Android JNI(Java Native Interface)是Android系统提供的一种机制,它允许Java代码和其他语言(如C和C++)编写的代码进行交互。JNI在Android开发中扮演着重要角色,尤其是在性能优化、利用现有C/C++库以及实现低级...
Android JNI(Java Native Interface)是Android平台上的一个关键特性,它允许Java代码和其他语言写的代码进行交互,通常用于提升性能、调用系统底层库或利用C/C++的库。在这个"android JNI学习三实例"中,我们将...
Android JNI(Java Native Interface)是Android平台中用于Java和C/C++代码交互的桥梁,它允许开发者在Android应用中调用本地库,实现性能优化、使用已有的C/C++库或者利用硬件特性等功能。这篇博客文章《Android ...
在本文中,我们将深入探讨如何在Android JNI中实现C++层与Java层的对象交互,特别是在NDK开发环境下。 首先,让我们了解JNI的基本概念。JNI是一个接口,它允许Java应用程序调用本地(非Java)代码,同时也允许本地...
本篇文章将深入探讨如何在JNI中传递对象数组,包括字符串、整数和小数。 首先,我们需要了解JNI的基本架构。在Java层,我们创建一个本地方法声明,这个方法将被JNI调用。在C/C++层,我们实现这个本地方法,并通过...
在JNI中,如果要在C/C++和Java之间传递结构体,就需要定义相应的Java类来匹配C/C++中的结构体,并且实现必要的JNI方法来进行转换。 #### 四、实例分析 假设有一个表示硬盘信息的结构体`DiskInfo`: ```c struct ...
在Android应用开发中,JNI(Java Native Interface)是一种让Java代码与本地代码(C/C++)交互的关键技术。本文将详细介绍在Eclipse环境下进行Android JNI开发的基本知识点,包括环境配置、开发流程、常见问题以及一...
- JNI接口是Java虚拟机(JVM)和本地代码之间的桥梁,它为Java程序员提供了一种方法来编写可以与Java代码一起使用的C/C++代码。 - JNI定义了一系列的函数,这些函数使得本地方法可以访问Java对象,调用Java方法,...