Android NDK编程
来源:互联网 发布:qq活动抽奖软件 编辑:程序博客网 时间:2024/05/16 01:15
NDK编程的步骤
(前提:eclipse拥有ndk编程环境. 此工程演示文件拆分、合并的功能)
-
新建Android工程(废话)
创建类编写java层native方法
/** * 拆分 * @param path 文件原始路径 * @param path_pattern 拆分的路径 * @param count 拆分的个数 */ public native static void diff(String path,String path_pattern,int count); /** * 合并 * @param path_pattern 拆分的文件 * @param count 个数 * @param merge_path 合并后的文件 */ public native static void patch(String path_pattern,int count,String merge_path);
3.使用javah命令 生成.h头文件(命令行进入src目录后:javah 文件全称)
javah com.ph.ndkfilepatch
4.创建jni目录,将.h头文件放入
5.工作空间引入ndk
6.工程添加本地支持add native support
android tools–>add native support
7.添加路径和符号
工程右键–>Properties
8.实现头文件中定义的函数
//拆分JNIEXPORT void JNICALL Java_com_dongnaoedu_ndkfilepatch_NDKFileUtils_diff (JNIEnv *env, jclass jcls, jstring path_jstr,jstring path_pattern_jstr, jint file_num){ //jstring -> char* //需要分割的文件路径 const char* path = (*env)->GetStringUTFChars(env,path_jstr,NULL); const char* path_pattern = (*env)->GetStringUTFChars(env,path_pattern_jstr,NULL); //得到分割之后的子文件的路径列表 char **patches = malloc(sizeof(char*) * file_num); int i = 0; for (; i < file_num; i++) { patches[i] = malloc(sizeof(char) * 100); //元素赋值 //需要分割的文件:C://jason/liuyan.png //子文件:C://jason/liuyan_%d.png sprintf(patches[i], path_pattern, (i+1)); LOGE("patch path:%s",patches[i]); } //不断读取path文件,循环写入file_num个文件中 // 整除 // 文件大小:90,分成9个文件,每个文件10 // 不整除 // 文件大小:110,分成9个文件, // 前(9-1)个文件为(110/(9-1))=13 // 最后一个文件(110%(9-1))=6 int filesize = get_file_size(path); FILE *fpr = fopen(path,"rb"); //整除 if(filesize % file_num == 0){ //单个文件大小 int part = filesize / file_num; i = 0; //逐一写入不同的分割子文件中 for (; i < file_num; i++) { FILE *fpw = fopen(patches[i], "wb"); int j = 0; for(; j < part; j++){ //边读边写 fputc(fgetc(fpr),fpw); } fclose(fpw); } } else{ //不整除 int part = filesize / (file_num - 1); i = 0; //逐一写入不同的分割子文件中 for (; i < file_num - 1; i++) { FILE *fpw = fopen(patches[i], "wb"); int j = 0; for(; j < part; j++){ //边读边写 fputc(fgetc(fpr),fpw); } fclose(fpw); } //the last one FILE *fpw = fopen(patches[file_num - 1], "wb"); i = 0; for(; i < filesize % (file_num - 1); i++){ fputc(fgetc(fpr),fpw); } fclose(fpw); } //关闭被分割的文件 fclose(fpr); //释放 i = 0; for(; i < file_num; i++){ free(patches[i]); } free(patches); (*env)->ReleaseStringUTFChars(env,path_jstr,path); (*env)->ReleaseStringUTFChars(env,path_pattern_jstr,path_pattern);}//合并JNIEXPORT void JNICALL Java_com_dongnaoedu_ndkfilepatch_NDKFileUtils_patch (JNIEnv *env, jclass jcls,jstring path_pattern_jstr, jint file_num,jstring merge_path_jstr){ //合并之后的文件 const char* merge_path = (*env)->GetStringUTFChars(env,merge_path_jstr,NULL); //分割子文件的pattern const char* path_pattern = (*env)->GetStringUTFChars(env,path_pattern_jstr,NULL); //得到分割之后的子文件的路径列表 char **patches = malloc(sizeof(char*) * file_num); int i = 0; for (; i < file_num; i++) { patches[i] = malloc(sizeof(char) * 100); //元素赋值 //需要分割的文件:C://jason/liuyan.png //子文件:C://jason/liuyan_%d.png sprintf(patches[i], path_pattern, (i+1)); LOGE("patch path:%s",patches[i]); } FILE *fpw = fopen(merge_path,"wb"); //把所有的分割文件读取一遍,写入一个总的文件中 i = 0; for(; i < file_num; i++){ //每个子文件的大小 int filesize = get_file_size(patches[i]); FILE *fpr = fopen(patches[i], "rb"); int j = 0; for (; j < filesize; j++) { fputc(fgetc(fpr),fpw); } fclose(fpr); } fclose(fpw); //释放 i = 0; for(; i < file_num; i++){ free(patches[i]); } free(patches); (*env)->ReleaseStringUTFChars(env,path_pattern_jstr,path_pattern); (*env)->ReleaseStringUTFChars(env,merge_path_jstr,merge_path);}
9.编译生成动态库(.so)
Project–>Build Project
10.加载动态库
static{ System.loadLibrary("NDK_patch"); }
0 0
- Android NDK 编程实例
- Android NDK编程入门
- android ndk 编程
- Android: NDK编程入门
- Android NDK编程入门
- Android + NDK + cygwin 编程
- Android NDK编程入门
- Android NDK 编程
- Android: NDK编程
- Android开发 NDK编程
- android studio NDK编程
- Android: NDK编程入门
- Android NDK编程
- Android NDK编程
- Android Studio Ndk 编程
- Android Studio NDK 编程
- Android NDK编程
- Android JNI + NDK 编程
- Implicit conversion of an Objective-C pointer to '__autoreleasing instancetype *' (aka '__autoreleas
- lsd:optimizationThreadLoop线程
- 高通mipi dsi代码理解
- Java 时间格式化,时间解析和时间计算的记录
- Educational Codeforces Round 16 E. Generate a String (dp)
- Android NDK编程
- 对ssh中struts、spring、hibernate分工的理解
- <1>黑电平
- 设计模式学习之路-策略模式
- 61. Rotate List
- mongodb安装
- 单词拼接(有向图的欧拉回路)
- Binary Tree Level Order Traversal
- 反编译apk文件,获取strings.xml文件的内容——使用apktool反编译