首页 文章 精选 留言 我的

精选列表

搜索[桌面应用开发],共10000篇文章
优秀的个人博客,低调大师

04.Eclipse下Ndk开发(以文件拆分合并为例模拟一下开发过程,参考文件加密的过程)

(创建于2017/12/6) 1.工具类PatchUtils package com.ren.ndk_file_patch; public class PatchUtils { static{ System.loadLibrary("ndk_file_patch"); } public native static void diff(String path,String path_pattern,int count); public native static void patch(String path_pattern,String merge_path,int count); } 2.生成的头文件 com_ren_ndk_file_patch_PatchUtils.h /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_ren_ndk_file_patch_PatchUtils */ #ifndef _Included_com_ren_ndk_file_patch_PatchUtils #define _Included_com_ren_ndk_file_patch_PatchUtils #ifdef __cplusplus extern "C" { #endif /* * Class: com_ren_ndk_file_patch_PatchUtils * Method: diff * Signature: (Ljava/lang/String;Ljava/lang/String;I)V */ JNIEXPORT void JNICALL Java_com_ren_ndk_1file_1patch_PatchUtils_diff (JNIEnv *, jclass, jstring, jstring, jint); /* * Class: com_ren_ndk_file_patch_PatchUtils * Method: patch * Signature: (Ljava/lang/String;Ljava/lang/String;I)V */ JNIEXPORT void JNICALL Java_com_ren_ndk_1file_1patch_PatchUtils_patch (JNIEnv *, jclass, jstring, jstring, jint); #ifdef __cplusplus } #endif #endif 3.编写的c文件 ndk_file_patch.c #include "com_ren_ndk_file_patch_PatchUtils.h" #include <jni.h> #include <stdio.h> #include <stdlib.h> #include<android/log.h> #define LOGI(FORMAT,...) __android_log_print(ANDROID_LOG_INFO,"renzhenming",FORMAT,__VA_ARGS__); #define LOGE(FORMAT,...) __android_log_print(ANDROID_LOG_ERROR),"renzhenming",FORMAT,__VA_ARGS__); long get_file_size(const char *path){ FILE *fl = fopen(path,"rb"); //把与fp有关的文件位置指针放到一个指定位置。 //文件指针定位到文件末尾,偏移0个字节 fseek(fl,0,SEEK_END); //函数用来获取文件读写指针的当前位置,对于二进制文件,则返回从文件开头到结尾的字节数。 return ftell(fl); } JNIEXPORT void JNICALL Java_com_ren_ndk_1file_1patch_PatchUtils_diff (JNIEnv *env, jclass jclz, jstring path_jstr, jstring path_pattern_jstr, jint file_num){ //转换文件路径 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(path_pattern的格式) sprintf(patches[i],path_pattern,(i+1)); LOGI("patch path:%s",patches[i]); } //不断读取path文件,循环写入file_num个文件中 // 整除 // 文件大小:90,分成9个文件,每个文件10 // 不整除 // 文件大小:110,分成9个文件, // 前(9-1)个文件为(110/(9-1))=13 // 最后一个文件(110%(9-1))=6 //获取文件大小 int file_size = get_file_size(path); //打开这个文件 FILE *fpr = fopen(path,"rb"); //整除 if(file_size % file_num == 0){ //单个文件大小 int part = file_size/file_num; int i =0; //逐一写入设置好的子文件路径中 for(;i<file_num;i++){ //从子文件路径打开一个FILE FILE *fpw = fopen(patches[i],"wb"); int j = 0; for(;j<part;j++){ //边读边写 //fgetc函数功能:从流中读取字符,即从fp所指定的文件中取得下一个字符。这里需要注意,在每取完一个字符时fp会自动向下移动一个字节。这样编成时,程序员就不用再对fp //控制了。这种功能在许多读写函数中都有体现。 fputc(fgetc(fpr),fpw); } fclose(fpw); } }else{ //无法整除 int part = file_size/(file_num-1); int 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); } //最后一个子文件 FILE *fpw = fopen(patches[file_num-1],"wb"); i = 0; for(;i<file_size%(file_num-1);i++){ fputc(fgetc(fpr),fpw); } fclose(fpw); } //释放 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); } /* * Class: com_ren_ndk_file_patch_PatchUtils * Method: patch * Signature: (Ljava/lang/String;Ljava/lang/String;I)V */ JNIEXPORT void JNICALL Java_com_ren_ndk_1file_1patch_PatchUtils_patch (JNIEnv *env, jclass jclz, jstring path_pattern_jstr, jstring merge_path_jstr, jint file_num){ //字符串转换 const char *merge_path = (*env)->GetStringUTFChars(env,merge_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); LOGI("patch path:%s",patches[i]); } //打开要merge_path为一个FILE FILE *fpw = fopen(merge_path,"wb"); //把所有分割的文件读取一遍,写入到这个总的文件中 i = 0; for(;i<file_num;i++){ //得到每个子文件的大小 int file_size = get_file_size(patches[i]); //打开每个子文件路径为一个FILE FILE *fpr = fopen(patches[i],"rb"); int j =0; for(;j<file_size;j++){ fputc(fgetc(fpr),fpw); } fclose(fpr); } fclose(fpw); //释放内存 i = 0; for(;i<file_num;i++){ free(patches[i]); } free(patches); (*env)->ReleaseStringUTFChars(env,merge_path_jstr,merge_path); (*env)->ReleaseStringUTFChars(env,path_pattern_jstr,path_pattern); } 4.Android.mk文件 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := ndk_file_patch LOCAL_SRC_FILES := ndk_file_patch.c LOCAL_LDLIBS := -llog //使用了log,需要引入 include $(BUILD_SHARED_LIBRARY) 5.开始拆分合并 public class MainActivity extends Activity { private String SD_CARD_PATH; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); SD_CARD_PATH = Environment.getExternalStorageDirectory().getAbsolutePath(); } public void diff(View view){ String path = SD_CARD_PATH +File.separatorChar+ "2.mp4"; String path_pattern = SD_CARD_PATH +File.separatorChar+ "2_%d.mp4"; PatchUtils.diff(path, path_pattern, 2); System.out.println("拆分完成"); } public void patch(View view){ String merge_path = SD_CARD_PATH +File.separatorChar+ "2_new.mp4"; String path_pattern = SD_CARD_PATH +File.separatorChar+ "2_%d.mp4"; PatchUtils.patch(path_pattern, merge_path, 2); System.out.println("合并完成"); } } 6.注意添加权限,6.0动态申请 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

优秀的个人博客,低调大师

《Android App开发入门:使用Android Studio 2.X开发环境》——2-7 使用 USB 线将程序部署到手机上执行

2-7 使用 USB 线将程序部署到手机上执行 先前都是在仿真器上测试程序执行结果,若想将写好的程序直接放在 Android 手机上执行,则可用手机附带的 USB 线把手机与计算机相连,再从 ADT 中直接将程序上传到手机中执行。若要使用 USB 连接的方式,则必须打开手机的调试功能。 进入手机的设置界面,按照下面的步骤设置,启用手机的调试功能(不同品牌 / 型号的手机,设置项的名称、位置可能略有不同)。 通过 USB 将 Android App 传送到手机安装并执行 要用手机连接 USB,还要安装手机的 USB 驱动程序,少数手机可使用 SDK 内附的Google USB Drive,多数手机则建议使用专用的驱动程序。若用户尚未安装手机的 USB 驱动程序,也不知如何下载,则可连接到 Android 网站(https://deve

优秀的个人博客,低调大师

从指标到洞见:GEO实证研究中的方法建构与应用指南

2023年底,一篇题为《GEO: Generative Engine Optimization》的预印本(arXiv 2311.09735)第一次系统地把生成式引擎优化(GEO)从经验操作提成了实证学科。它建立了GEO-bench——一个覆盖近万级查询、横跨多个领域的评测基准——用可复现的实验把“怎么在AI答案里获得可见性”这件事变成了有数据、有方法、有边界的知识。我(王涛)对它的判断很明确:GEO的价值不在于给出了一批优化技巧,而在于建立了一套“先测量、再优化”的研究范式,这正是今天国内大量GEO讨论最欠缺的东西。

优秀的个人博客,低调大师

反射内存卡在工业控制与分布式系统中的应用

现代工业控制系统正在从单机控制走向分布式控制:多台控制器、工作站、PLC 需要实时共享数据,协同完成复杂的控制任务。然而传统工业通信手段各有短板——CAN 总线数据率低(1Mbps 量级,响应时间 5~10ms);PROFIBUS 速率不足 12Mbps、响应时间大于 10ms;工业以太网受 CSMA/CD 机制影响,无法保证传输延迟的确定性,最坏延迟可达 1~10ms。对需要微秒级同步的场合,这些总线都不够"硬实时"。反射内存网络则提供了另一种思路:把共享内存搬到网络上。

优秀的个人博客,低调大师

反射内存卡在航空航天与飞行仿真中的应用

航空航天领域对数据通信有着近乎苛刻的要求:微秒级的数据同步、严格的时序确定性、跨多种总线与操作系统的互联能力、以及在严苛环境下的高可靠性。反射内存网络凭借"写入即广播、硬件透明、延迟确定"的特性,成为航空电子系统集成、飞行仿真、半实物测试等场景的主流选择。从某种意义上看,没有反射内存,现代大型飞行模拟器难以达到逼真度要求。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册