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






posted @ 2012-11-16 20:52  sfshine  阅读(155)  评论(0编辑  收藏  举报