最近一直在学安卓的jni,主要参考的是黑马程序员的视频教程,讲的确实不错。

那就自己总结一下吧,算是对学习的复习。

这篇博客也主要参考了这位博主:http://www.cnblogs.com/activity-life/p/3643047.html,在这里谢谢了

通过他的博客和视频教程,我结合了两者的方法,把功能实现了,毕竟这个是应用为主,自己学艺不精,这里积累下:

第一篇博客的总结所有Java调取jni是关于字符串的操作,主要包括以下三种类型:

  1. //对基本数据类型字符串的访问
  2. //0.无输入,有输出为字符串
  3. public native String helloFromC();
  4.  
  5. //1.有输入,有输出访问字串
  6. private native String GetNativeString(String str);
  7.  
  8. //2.输入字符串,并附带长度,输出字符串
  9. public native String encode(String text,int length);
  10. public native String decode(String text,int length);

那么根据教程所讲,当有输入字符串作为参数传过来时,使用如下函数将其转换为C语言的字符串函数指针:

  1. //把java的字符串转换成c的字符串
  2. char* Jstring2CStr(JNIEnv* env, jstring jstr)
  3. {
  4. char* rtn = NULL;
  5. jclass clsstring = (*env)->FindClass(env,"java/lang/String");
  6. jstring strencode = (*env)->NewStringUTF(env,"GB2312");
  7. jmethodID mid = (*env)->GetMethodID(env,clsstring, "getBytes", "(Ljava/lang/String;)[B");
  8. jbyteArray barr= (jbyteArray)(*env)->CallObjectMethod(env,jstr,mid,strencode); // String .getByte("GB2312");
  9. jsize alen = (*env)->GetArrayLength(env,barr);
  10. jbyte* ba = (*env)->GetByteArrayElements(env,barr,JNI_FALSE);
  11. if(alen > 0)
  12. {
  13. rtn = (char*)malloc(alen+1); //"\0"
  14. memcpy(rtn,ba,alen);
  15. rtn[alen]=0;
  16. }
  17. (*env)->ReleaseByteArrayElements(env,barr,ba,0); //
  18. return rtn;
  19. }

之后对其操作,这里我将对以上三种类型分别展示jni中的使用:

  1. 0.无输入,有输出为字符串:
  1. jstring Java_com_swust_string_MainActivity_helloFromC(JNIEnv* env,jobject obj){
  2. //C语言的字符串
  3. char* cstr="hello paopao from C";
  4. //把C语言字符串转换为Java的字符串
  5. //jstring (*NewStringUTF)(JNIEnv*, const char*);
  6. //jstring jstr=(*(*env)).NewStringUTF(env,cstr)
  7. jstring jstr = (*env)->NewStringUTF(env, cstr);
  8.  
  9. return jstr;
  10. }
  1. 1.有输入,有输出访问字串:
  1. //把java的字符串转换成c的字符串
  2. char* Jstring2CStr(JNIEnv* env, jstring jstr)
  3. {
  4. char* rtn = NULL;
  5. jclass clsstring = (*env)->FindClass(env,"java/lang/String");
  6. jstring strencode = (*env)->NewStringUTF(env,"GB2312");
  7. jmethodID mid = (*env)->GetMethodID(env,clsstring, "getBytes", "(Ljava/lang/String;)[B");
  8. jbyteArray barr= (jbyteArray)(*env)->CallObjectMethod(env,jstr,mid,strencode); // String .getByte("GB2312");
  9. jsize alen = (*env)->GetArrayLength(env,barr);
  10. jbyte* ba = (*env)->GetByteArrayElements(env,barr,JNI_FALSE);
  11. if(alen > 0)
  12. {
  13. rtn = (char*)malloc(alen+1); //"\0"
  14. memcpy(rtn,ba,alen);
  15. rtn[alen]=0;
  16. }
  17. (*env)->ReleaseByteArrayElements(env,barr,ba,0); //
  18. return rtn;
  19. }
  20. JNIEXPORT jstring JNICALL Java_com_swust_string_MainActivity_GetNativeString
  21. (JNIEnv *env, jobject obj, jstring jstr){
  22. //获取输入的字符串
  23. char* cstr=Jstring2CStr(env,jstr);
  24. char* pUTF8Str = "From jni String";
  25. strcat(cstr, "/"); //加一个分隔符
  26. strcat(cstr, pUTF8Str); //联接一个本地字串
  27. //C语言的字符串转换为jstring
  28. return (*env)->NewStringUTF(env,cstr);
  29. }

自己实现的基本功能是将Java传入的字符串和C的字符串合并,并返回。

  1. 2.输入字符串,并附带长度,输出字符串:
    该种类型根据教程写了两个函数(编码和解码),可视为同一种类型:
  1. //把java的字符串转换成c的字符串
  2. char* Jstring2CStr(JNIEnv* env, jstring jstr)
  3. {
  4. char* rtn = NULL;
  5. jclass clsstring = (*env)->FindClass(env,"java/lang/String");
  6. jstring strencode = (*env)->NewStringUTF(env,"GB2312");
  7. jmethodID mid = (*env)->GetMethodID(env,clsstring, "getBytes", "(Ljava/lang/String;)[B");
  8. jbyteArray barr= (jbyteArray)(*env)->CallObjectMethod(env,jstr,mid,strencode); // String .getByte("GB2312");
  9. jsize alen = (*env)->GetArrayLength(env,barr);
  10. jbyte* ba = (*env)->GetByteArrayElements(env,barr,JNI_FALSE);
  11. if(alen > 0)
  12. {
  13. rtn = (char*)malloc(alen+1); //"\0"
  14. memcpy(rtn,ba,alen);
  15. rtn[alen]=0;
  16. }
  17. (*env)->ReleaseByteArrayElements(env,barr,ba,0); //
  18. return rtn;
  19. }
  20. JNIEXPORT jstring JNICALL Java_com_swust_string_MainActivity_GetNativeString
  21. (JNIEnv *env, jobject obj, jstring jstr){
  22. //获取输入的字符串
  23. char* cstr=Jstring2CStr(env,jstr);
  24. char* pUTF8Str = "From jni String";
  25. strcat(cstr, "/"); //加一个分隔符
  26. strcat(cstr, pUTF8Str); //联接一个本地字串
  27. //C语言的字符串转换为jstring
  28. return (*env)->NewStringUTF(env,cstr);
  29. }
  30. JNIEXPORT jstring JNICALL Java_com_swust_string_MainActivity_encode
  31. (JNIEnv *env, jobject obj, jstring jstr , jint length){
  32. //根据老师给的函数,生成C语言的字符指针
  33. //arg1:Java环境指针 arg2:java的字符串
  34. char* cstr=Jstring2CStr(env,jstr);
  35. int i=0;
  36. //C语言的int和jint的相同,故直接使用length
  37. for(i=0;i<length;i++){
  38. *(cstr+i)+=1;
  39. }
  40. //C语言的字符串转换为jstring
  41. return (*env)->NewStringUTF(env,cstr);
  42. }

为了代码看起来比较明了,这里不贴项目代码了,只展示效果图:

  1. 0.无输入,有输出为字符串:显示“hello paopao from c"
  1. 1.有输入,有输出访问字串:显示”hello from java / hello from jni"
  1. 2.输入字符串,并附带长度,输出字符串:显示编码和解码功能:

  1.  

Android jni 编程1(对基本类型字符串的操作)的更多相关文章

  1. Android jni 编程4(对基本类型二维整型数组的操作)

    Android jni 编程 对于整型二维数组操作: 类型一:传入二维整型数组,返回一个整型值 类型二:传入二维整型数组,返回一个二维整型数组 声明方法: private native int Sum ...

  2. Android jni 编程(参数的传递,成员,方法的)相互访问

    package com.test.androidjni; import android.app.Activity; import android.os.Bundle; import android.u ...

  3. Android jni 编程3(对基本类型一维整型数组的操作)总结版

    主要学习资料:黑马程序员的NDK方法使用(生产类库so)              jni编程指南中文版(已上传至博客园) 博主文章(它使用的是VS和eclipse联合开发):http://www.c ...

  4. 【转】Android JNI编程—JNI基础

    原文网址:http://www.jianshu.com/p/aba734d5b5cd 最近看到了很多关于热补的开源项目——Depoxed(阿里).AnFix(阿里).DynamicAPK(携程)等,它 ...

  5. Android jni 编程入门

    本文将介绍如何使用eclipse和ndk-build来编写一个基于Android4.4版本的包含有.so动态库的安卓程序. 前提是已经安装和配置好了诸如SDK,NDK等编译环境.下面开始编程! 1 程 ...

  6. 【转】android JNI编程 一些技巧(整理)

    原文网址:http://blog.csdn.net/linweig/article/details/5203716 本篇将介绍在JNI编程中如何传递参数和返回值. 首先要强调的是,native方法不但 ...

  7. Android jni 编程2(对基本类型一维整型数组的操作)

    参考教程和这位博主的对一维数组的处理,主要包括以下三种类型: //传入一维数组,无返回值 public native void arrayEncode(int[] arr); //传一个一维数组和数组 ...

  8. Android JNI编程(八)——体验AS2.2.2编写Jni程序、Java调C、C调Java函数、将C代码中的Log打印至Logcat

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 不得不说在AS2.2以上的版本进行开发就一个字——爽,在2.0上使用jni出 ...

  9. Android JNI编程(七)——使用AndroidStudio编写第一个JNI程序

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 1.简单介绍一下NDK和JNI NDK:NDK是Native Develop ...

随机推荐

  1. MySQL的IP处理函数inet_aton()和inet_ntoa()

    给出一个作为字符串的网络地址的"点地址"(如127.0.0.1)表示,返回一个代表该地址数值的整数.地址可以是4或8比特地址. mysql> SELECT inet_aton ...

  2. getElementsByTagName("div")和$("div")区别

    作者:zccst <body> <div class="selected">1</div> <div class="select ...

  3. 扩展对EasyUI的校验规则

    var myReg = RegExp(/[(\*)(\|)(\\)(\:)(\")(\/)(\<)(\>)(\?)]+/); $.extend($.fn.validatebox. ...

  4. 浅谈IOS8之size class

    文章目录 1. 简介 2. 实验 3. 实战 3.1. 修改 Constraints 3.2. 安装和卸载 Constraints 3.3. 安装和卸载 View 3.4. 其他 4. 后话 以前和安 ...

  5. Java Web EL JSTL的用法

    1.导入包 fastjson-1.2.2.jar 2.JSP文件加入 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" p ...

  6. gridview里item是textView、Button单击事件相应,以及按下效果的取去除

    1.响应事件的区别: gridview的item是textView的时候,gridview的itemonclick事件可以正常相应,但是换了Button后不能,原因如下: public class B ...

  7. java系列-JDBC的封装

    参考:http://blog.csdn.net/liuhenghui5201/article/details/16369773 一. 1.加载驱动-->>封装    --->> ...

  8. Round Numbers(poj 3252)

    题意:算出区间内二进制中0的个数大于等于1的个数的数字有多少个 /* 本来以为用数位DP搞,但是组合数更简单. 我们设n的二进制长度为len. ①:先考虑长度小于len的数字. 这里以数字22为例,二 ...

  9. zMPLS的安装与配置

    1.zmpls的安装 1.1安装环境 ubuntu 12.04 kernel 2.6.35 (对原来的内核进行了替换) 1.2 下载链接 文件zMPLS-0.95-alpha.tar.gz的下载地址为 ...

  10. matlab计算矩阵每列非0元素个数

    在统计分析中,有时候需要计算矩阵每列非0元素的个数,可以用以下方法: 先用find找到每列不为0的元素index,然后用count计数. 假设有矩阵A[M,N], 结果存在countZeros cou ...