最近一直在学安卓的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(对基本类型字符串的操作)的更多相关文章

  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. 21、手把手教你Extjs5(二十一)模块Form的自定义的设计

    前面几节完成了模块Grid的自定义,模块Form自定义的过程和Grid的过程类似,但是要更复杂一些.先来设计一下要完成的总体目标. 1、可以有多个Form方案,对应于显示.新增.修改.审核.审批等功能 ...

  2. STM32/GD32芯片信息(转)

    源:STM32/GD32芯片信息 因为需要自动适配芯片进行系统配置,所以我们有必要通过读取一些系统寄存器来获取必要信息.我们的代码需要兼容STM32F1/GD32F1/STM32F0/STM32F4 ...

  3. Xcode6之后创建Pch预编译文件

    在Xcode6之前,创建一个新工程xcode会在Supporting files文件夹下面自动创建一个“工程名-Prefix.pch”文件,也是一个头文件,pch头文件的内容能被项目中的其他所有源文件 ...

  4. tp框架

    <?php namespace Admin\Controller; use Think\Controller; class DengluController extends Controller ...

  5. log4j的用法

    1.导入 2.在src下新建log4j.properties,内容如下 log4j.rootLogger=DEBUG, A1 ,R log4j.appender.A1=org.apache.log4j ...

  6. 今天学习了下,如何破解wifi

    破解了隔壁的wif,得罪了,哥哥要蹭网一段时间. 主要思路:安装linux环境.这里我选择了虚拟机加cdlinux .运行里面的min抓得握手包,然后淘宝花10元跑下包,因为自己的电脑不行,跑费时间太 ...

  7. TSP问题 遗传算法 智能优化算法

    写了半天,效率还是有点低的,以后有空再优化下: //用次序表示法来表示个体编码 #include<iostream> #include<fstream> #include< ...

  8. dubbo框架揭秘之服务引用

    ApplicationConfig config = new ApplicationConfig("hello-worldp"); RegistryConfig reg = new ...

  9. 负载均衡探测器lbd

    负载均衡探测器lbd   大型网站为了解决海量访问问题,往往采用负载均衡技术,将用户的访问分配到不同的服务器上.网站的负载均衡可以从DNS和HTTP两个环节进行实施.在进行Web渗透测试的时候,需要先 ...

  10. ui-router---$stateProvider

    转自:http://blog.csdn.net/violet_day/article/details/17515157 $stateProvider $stateProvider.state(stat ...