NDK学习 mp3解码器等相关

来源:互联网 发布:中华网络一条龙公司 编辑:程序博客网 时间:2024/04/29 21:01

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();}






原创粉丝点击