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 ...
随机推荐
- js之动态加载等待图像地址汇总
Ajax火啊,火到了居然Loading Icons都有很多人专门提供的地步.下面是我同事给我介绍的一些提供Ajax Activity Indicators的网站,共享给大家,以便让我们的Ajax应用具 ...
- rapidjson 使用教程
在cocos2d-x引入了rapidjson,它处理速度比其他的json库快,反正不管了,我们这边只是学习下如何使用.rapidjson官方网址: https://code.google.com/p/ ...
- UVA - 208 Firetruck(消防车)(并查集+回溯)
题意:输入着火点n,求结点1到结点n的所有路径,按字典序输出,要求结点不能重复经过. 分析:用并查集事先判断结点1是否可以到达结点k,否则会超时.dfs即可. #pragma comment(link ...
- iOS开发——Scheme白名单
问题:在iOS 9下涉及到平台客户端跳转,系统会自动到项目info.plist下检测是否设置平台Scheme.对于需要配置的平台,如果没有配置,就无法正常跳转平台客户端. 报错:This app is ...
- 10.8.5如何升级(app store 出错 请稍后重试 100)
出现问题:苹果以前的老版本,OS X 10.8或是10.8.5在当年提示你升级,你又任性没升级的时候,拖过那阵,你再想升级,就是各种报复.进app store下载或是更新东西都是弹出app stpre ...
- UIAlertView使用全解
举例: UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Default Alert View"messa ...
- Codeforces Round 212 Div 2 报告(以前没写完,现在也没心情补了,先就这样吧)
A. Two Semiknights Meet 题目大意:有一个8x8的棋盘,上面放有两个骑士,骑士以“田字”的方式走.每个方格都被定义为good或者bad,问骑士能否在good的格子中相遇? 由于骑 ...
- imagebutton、imageview的属性
[转]http://blog.csdn.net/victoryckl/article/details/14162131 http://blog.sina.com.cn/s/blog_68b3fdc30 ...
- sql语句的截取字符串下标是从1开始
这里的指的sqliter数据库 substr函数 substr(date,1,10)
- java域名解析
DNS原理:http://amon.org/dns-introduction.html 根域:就是所谓的“.” 根域服务器只是具有13个IP地址,但机器数量却不是13台,因为这些IP地址借助了任播的技 ...