Android jni 编程1(对基本类型字符串的操作)
最近一直在学安卓的jni,主要参考的是黑马程序员的视频教程,讲的确实不错。
那就自己总结一下吧,算是对学习的复习。
这篇博客也主要参考了这位博主:http://www.cnblogs.com/activity-life/p/3643047.html,在这里谢谢了
通过他的博客和视频教程,我结合了两者的方法,把功能实现了,毕竟这个是应用为主,自己学艺不精,这里积累下:
第一篇博客的总结所有Java调取jni是关于字符串的操作,主要包括以下三种类型:
- //对基本数据类型字符串的访问
- //0.无输入,有输出为字符串
- public native String helloFromC();
- //1.有输入,有输出访问字串
- private native String GetNativeString(String str);
- //2.输入字符串,并附带长度,输出字符串
- public native String encode(String text,int length);
- public native String decode(String text,int length);
那么根据教程所讲,当有输入字符串作为参数传过来时,使用如下函数将其转换为C语言的字符串函数指针:
- //把java的字符串转换成c的字符串
- char* Jstring2CStr(JNIEnv* env, jstring jstr)
- {
- char* rtn = NULL;
- jclass clsstring = (*env)->FindClass(env,"java/lang/String");
- jstring strencode = (*env)->NewStringUTF(env,"GB2312");
- jmethodID mid = (*env)->GetMethodID(env,clsstring, "getBytes", "(Ljava/lang/String;)[B");
- jbyteArray barr= (jbyteArray)(*env)->CallObjectMethod(env,jstr,mid,strencode); // String .getByte("GB2312");
- jsize alen = (*env)->GetArrayLength(env,barr);
- jbyte* ba = (*env)->GetByteArrayElements(env,barr,JNI_FALSE);
- if(alen > 0)
- {
- rtn = (char*)malloc(alen+1); //"\0"
- memcpy(rtn,ba,alen);
- rtn[alen]=0;
- }
- (*env)->ReleaseByteArrayElements(env,barr,ba,0); //
- return rtn;
- }
之后对其操作,这里我将对以上三种类型分别展示jni中的使用:
- 0.无输入,有输出为字符串:
- jstring Java_com_swust_string_MainActivity_helloFromC(JNIEnv* env,jobject obj){
- //C语言的字符串
- char* cstr="hello paopao from C";
- //把C语言字符串转换为Java的字符串
- //jstring (*NewStringUTF)(JNIEnv*, const char*);
- //jstring jstr=(*(*env)).NewStringUTF(env,cstr)
- jstring jstr = (*env)->NewStringUTF(env, cstr);
- return jstr;
- }
- 1.有输入,有输出访问字串:
- //把java的字符串转换成c的字符串
- char* Jstring2CStr(JNIEnv* env, jstring jstr)
- {
- char* rtn = NULL;
- jclass clsstring = (*env)->FindClass(env,"java/lang/String");
- jstring strencode = (*env)->NewStringUTF(env,"GB2312");
- jmethodID mid = (*env)->GetMethodID(env,clsstring, "getBytes", "(Ljava/lang/String;)[B");
- jbyteArray barr= (jbyteArray)(*env)->CallObjectMethod(env,jstr,mid,strencode); // String .getByte("GB2312");
- jsize alen = (*env)->GetArrayLength(env,barr);
- jbyte* ba = (*env)->GetByteArrayElements(env,barr,JNI_FALSE);
- if(alen > 0)
- {
- rtn = (char*)malloc(alen+1); //"\0"
- memcpy(rtn,ba,alen);
- rtn[alen]=0;
- }
- (*env)->ReleaseByteArrayElements(env,barr,ba,0); //
- return rtn;
- }
- JNIEXPORT jstring JNICALL Java_com_swust_string_MainActivity_GetNativeString
- (JNIEnv *env, jobject obj, jstring jstr){
- //获取输入的字符串
- char* cstr=Jstring2CStr(env,jstr);
- char* pUTF8Str = "From jni String";
- strcat(cstr, "/"); //加一个分隔符
- strcat(cstr, pUTF8Str); //联接一个本地字串
- //C语言的字符串转换为jstring
- return (*env)->NewStringUTF(env,cstr);
- }
自己实现的基本功能是将Java传入的字符串和C的字符串合并,并返回。
- 2.输入字符串,并附带长度,输出字符串:
该种类型根据教程写了两个函数(编码和解码),可视为同一种类型:
- //把java的字符串转换成c的字符串
- char* Jstring2CStr(JNIEnv* env, jstring jstr)
- {
- char* rtn = NULL;
- jclass clsstring = (*env)->FindClass(env,"java/lang/String");
- jstring strencode = (*env)->NewStringUTF(env,"GB2312");
- jmethodID mid = (*env)->GetMethodID(env,clsstring, "getBytes", "(Ljava/lang/String;)[B");
- jbyteArray barr= (jbyteArray)(*env)->CallObjectMethod(env,jstr,mid,strencode); // String .getByte("GB2312");
- jsize alen = (*env)->GetArrayLength(env,barr);
- jbyte* ba = (*env)->GetByteArrayElements(env,barr,JNI_FALSE);
- if(alen > 0)
- {
- rtn = (char*)malloc(alen+1); //"\0"
- memcpy(rtn,ba,alen);
- rtn[alen]=0;
- }
- (*env)->ReleaseByteArrayElements(env,barr,ba,0); //
- return rtn;
- }
- JNIEXPORT jstring JNICALL Java_com_swust_string_MainActivity_GetNativeString
- (JNIEnv *env, jobject obj, jstring jstr){
- //获取输入的字符串
- char* cstr=Jstring2CStr(env,jstr);
- char* pUTF8Str = "From jni String";
- strcat(cstr, "/"); //加一个分隔符
- strcat(cstr, pUTF8Str); //联接一个本地字串
- //C语言的字符串转换为jstring
- return (*env)->NewStringUTF(env,cstr);
- }
- JNIEXPORT jstring JNICALL Java_com_swust_string_MainActivity_encode
- (JNIEnv *env, jobject obj, jstring jstr , jint length){
- //根据老师给的函数,生成C语言的字符指针
- //arg1:Java环境指针 arg2:java的字符串
- char* cstr=Jstring2CStr(env,jstr);
- int i=0;
- //C语言的int和jint的相同,故直接使用length
- for(i=0;i<length;i++){
- *(cstr+i)+=1;
- }
- //C语言的字符串转换为jstring
- return (*env)->NewStringUTF(env,cstr);
- }
为了代码看起来比较明了,这里不贴项目代码了,只展示效果图:
- 0.无输入,有输出为字符串:显示“hello paopao from c"
- 1.有输入,有输出访问字串:显示”hello from java / hello from jni"
- 2.输入字符串,并附带长度,输出字符串:显示编码和解码功能:
Android jni 编程1(对基本类型字符串的操作)的更多相关文章
- Android jni 编程4(对基本类型二维整型数组的操作)
Android jni 编程 对于整型二维数组操作: 类型一:传入二维整型数组,返回一个整型值 类型二:传入二维整型数组,返回一个二维整型数组 声明方法: private native int Sum ...
- Android jni 编程(参数的传递,成员,方法的)相互访问
package com.test.androidjni; import android.app.Activity; import android.os.Bundle; import android.u ...
- Android jni 编程3(对基本类型一维整型数组的操作)总结版
主要学习资料:黑马程序员的NDK方法使用(生产类库so) jni编程指南中文版(已上传至博客园) 博主文章(它使用的是VS和eclipse联合开发):http://www.c ...
- 【转】Android JNI编程—JNI基础
原文网址:http://www.jianshu.com/p/aba734d5b5cd 最近看到了很多关于热补的开源项目——Depoxed(阿里).AnFix(阿里).DynamicAPK(携程)等,它 ...
- Android jni 编程入门
本文将介绍如何使用eclipse和ndk-build来编写一个基于Android4.4版本的包含有.so动态库的安卓程序. 前提是已经安装和配置好了诸如SDK,NDK等编译环境.下面开始编程! 1 程 ...
- 【转】android JNI编程 一些技巧(整理)
原文网址:http://blog.csdn.net/linweig/article/details/5203716 本篇将介绍在JNI编程中如何传递参数和返回值. 首先要强调的是,native方法不但 ...
- Android jni 编程2(对基本类型一维整型数组的操作)
参考教程和这位博主的对一维数组的处理,主要包括以下三种类型: //传入一维数组,无返回值 public native void arrayEncode(int[] arr); //传一个一维数组和数组 ...
- Android JNI编程(八)——体验AS2.2.2编写Jni程序、Java调C、C调Java函数、将C代码中的Log打印至Logcat
版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 不得不说在AS2.2以上的版本进行开发就一个字——爽,在2.0上使用jni出 ...
- Android JNI编程(七)——使用AndroidStudio编写第一个JNI程序
版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 1.简单介绍一下NDK和JNI NDK:NDK是Native Develop ...
随机推荐
- MySQL的IP处理函数inet_aton()和inet_ntoa()
给出一个作为字符串的网络地址的"点地址"(如127.0.0.1)表示,返回一个代表该地址数值的整数.地址可以是4或8比特地址. mysql> SELECT inet_aton ...
- getElementsByTagName("div")和$("div")区别
作者:zccst <body> <div class="selected">1</div> <div class="select ...
- 扩展对EasyUI的校验规则
var myReg = RegExp(/[(\*)(\|)(\\)(\:)(\")(\/)(\<)(\>)(\?)]+/); $.extend($.fn.validatebox. ...
- 浅谈IOS8之size class
文章目录 1. 简介 2. 实验 3. 实战 3.1. 修改 Constraints 3.2. 安装和卸载 Constraints 3.3. 安装和卸载 View 3.4. 其他 4. 后话 以前和安 ...
- Java Web EL JSTL的用法
1.导入包 fastjson-1.2.2.jar 2.JSP文件加入 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" p ...
- gridview里item是textView、Button单击事件相应,以及按下效果的取去除
1.响应事件的区别: gridview的item是textView的时候,gridview的itemonclick事件可以正常相应,但是换了Button后不能,原因如下: public class B ...
- java系列-JDBC的封装
参考:http://blog.csdn.net/liuhenghui5201/article/details/16369773 一. 1.加载驱动-->>封装 --->> ...
- Round Numbers(poj 3252)
题意:算出区间内二进制中0的个数大于等于1的个数的数字有多少个 /* 本来以为用数位DP搞,但是组合数更简单. 我们设n的二进制长度为len. ①:先考虑长度小于len的数字. 这里以数字22为例,二 ...
- zMPLS的安装与配置
1.zmpls的安装 1.1安装环境 ubuntu 12.04 kernel 2.6.35 (对原来的内核进行了替换) 1.2 下载链接 文件zMPLS-0.95-alpha.tar.gz的下载地址为 ...
- matlab计算矩阵每列非0元素个数
在统计分析中,有时候需要计算矩阵每列非0元素的个数,可以用以下方法: 先用find找到每列不为0的元素index,然后用count计数. 假设有矩阵A[M,N], 结果存在countZeros cou ...