NDK学习 mp3解码器等相关
C写文件
#include<stdio.h> main(){ // java // File file = new File("1.txt") // 打开一个文件的c语言的函数 // sharedpreference db content.openoutput() // 获取到文件的指针 FILE* fp = fopen("1.txt","wt"); char* str ="haha wirte file"; // fwrite方法接受4个参数 // 第一个参数 写什么内容 // 第二个参数 是一次 数据写多长 // 第三个参数 是写多少次 // 第四个参数 写到哪个文件里面 int len = fwrite(str,sizeof(char),15,fp); printf("len =%d\n",len); //释放文件句柄 fclose(fp); system("pause"); }
c读文件
#include<stdio.h> main(){ FILE* fp = fopen("1.txt","rt"); char arr[20]={}; //第一个参数 是读出来内容放在哪里 // 第二个 参数 一次读的数据的长度 // 第三个参数 读多少次 // 第四个参数 从哪个文件里面读 int read = fread(arr,sizeof(char),15,fp); printf("arr = %s\n",arr); printf("读了%d个char类型\n",read); fclose(fp);//必须加入 否则会造成一直在占用这个文件 system("pause"); }
编写编码器应用的流程
1.明确需求
2.研究技术实现 如果没有做过 需要进行一定时间的调研,如果还不能ok 只能想办法绕过这个知识点实现需求
3.实施:
-1 研究c源码解码器的工作过程,找到核心代码 找到入口等
-2将核心代码放入jni然后编译 注意头文件的引入
-3测试
注意android需要在
LOCAL_SRC_FILES 描述中把所有的c文件都知名 可以做个 程序获取
这次老师代码有个不好的地方是没有吧解码器的代码进行封装 如果封装成一个方法 然后输入文件输出文件就可以了
另外
含有进度的进度条有两种 一种是真正计算出来的进度去 一种是估算出来的 会在99%哪里卡住.
进度条的实现
pd = new ProgressDialog(this); pd.setMessage("转换中...."); pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); pd.setMax(size); // 设置进度条的最大值
然后在c代码中调用用
public void setConvertProgress(int progress){
pd.setProgress(progress);
}
来实现pd的刷新
c代码
void publishJavaProgress(JNIEnv * env, jobject obj, jint progress) { // 调用java代码 更新程序的进度条 // 1.找到java的LameActivity的class // jclass (*FindClass)(JNIEnv*, const char*); jclass clazz = (*env)->FindClass(env, "cn/itcast/lame/LameActivity"); if (clazz == 0) { LOGI("can't find clazz"); }LOGI(" find clazz"); //2 找到class 里面的方法定义 // jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*); jmethodID methodid = (*env)->GetMethodID(env, clazz, "setConvertProgress", "(I)V"); if (methodid == 0) { LOGI("can't find methodid"); }LOGI(" find methodid"); //3 .调用方法 // void (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...); (*env)->CallVoidMethod(env, obj, methodid, progress); }
然后是使用exec方法执行bin文件这个自己在截屏那里已经用过 现在知道了是使用那个Sourcery G++ Lite Edition for ARM工具来交叉编译
但是这里老师执行bin文件后可以传出一个值
try { //Process process = Runtime.getRuntime().exec("/data/data/hello"); Process process = Runtime.getRuntime().exec("date"); InputStream is = process.getInputStream(); DataInputStream dis = new DataInputStream(is); String result ; StringBuilder sb = new StringBuilder(); while((result = dis.readLine())!=null){ sb.append(result); sb.append("\n"); } System.out.println(sb.toString()); } catch (Exception e) { e.printStackTrace(); }