首页 > 代码库 > JNI开发案例开发总结

JNI开发案例开发总结

基础知识:

JNI(Java Native Interface,JAVA原生接口

使用JNI可以使Java代码和其他语言写的代码(C/C++代码)进行交互。

 

问:为什么要进行交互?

|-  首先,Java语言提供的类库无法满足要求,且在数学运算,实时渲染的游戏上,音视频处理等方面上C/C++相比效率稍低。 

|-  然后,Java语言无法直接操作硬件C/C++代码不仅能操作硬件而且还能发挥硬件最佳性能

|-  接着,使用Java调用本地的C/C++代码所写的库,省去了重复开发的麻烦,并且可以利用很多开源的库提高程序效率

 

C语言常见术语:

库函数:

|-  为了代码重用,在C语言中提供了一些常用的用于执行一些标准任务(如输入/)的函数,这些函数事先被编译,并生成目标代码,然后将生成的目标代码打包成一个库文件以供再次使用 库文件中的函数被称为库函数库文件被称为函数库

|-  WindowsC语言库函数中的目标代码都是以.obj为后缀的,Linux中是以 .o为后缀。

提示:单个目标代码是无法直接执行的,目标代码在运行之前需要使用连接程序将目标代码和其他库函数连接在一起后生成可执行的文件。

 

头文件:

|-  头文件中存放的是对某个库中所定义的函数类型全局变量等进行声明,它类似于一份仓库清单。若用户程序中需要使用某个库中的函数,则只需要将该库所对应的头文件include到程序中即可。

   |-  头文件中定义的是库中所有函数函数原型。而函数的具体实现则是在库文件中。

   |-  简单的说:头文件是给编译器用的,库文件是给连接器用的。

|-  在连接器连接程序时,会依据用户程序中导入的头文件,将对应的库函数导入到程序中。头文件以.h为后缀名。 

 

函数库:

|-  动态库:在编译用户程序时不会将用户程序内使用的库函数连接到用户程序的目标代码中,只有在运行时,且用户程序执行到相关函数时才会调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小

|-  静态库:在编译用户程序时会将其内使用的库函数连接到目标代码中,程序运行时不再需要静态库使用静态库生成可执行文件比较大

 

Linux中:

|-  静态库命名一般为:lib+库名+.a 。

|-  如:libcxy.a 其中lib说明此文件是一个库文件cxy库的名称.a说明是静态的

|-  动态库命名一般为:lib+库名+.so .so说明是动态的

 

交叉编译:

|-  目标代码连接成当前计算机可执行的二进制程序时,连接程序会根据当前计算机的CPU操作系统类型来转换

根据运行的设备的不同,可以将cpu分为:

armeabi

armeabi-v7a

mips

x86

|-  arm结构 :主要在移动手持嵌入式设备上

|-  x86结构 : 主要在台式机笔记本上使用。如IntelAMDCPU 

若想在使用了基于x86结构CPU的操作系统中编译出可以在基于arm结构CPU的操作系统上运行的代码,就必须使用交叉编译

交叉编译:一个平台下编译出在另一个平台中可以执行的二进制代码Google提出的NDK就可以完成交叉编译的工作。

 

NDK全称:Native Development Kit 

|-  NDK一系列工具的集合它有很多作用

   |-  首先,NDK可以帮助开发者快速开发C(C++)动态库

   |-  其次,NDK集成了交叉编译器。使用NDK,我们可以将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率

NDK工具必须在Linux下运行,它可以在linux环境下编译出可以在arm平台下运行的二进制库文件。(NDK-R7版本以上也可以在window上运行了)

  

使用JNI技术,其实就是在Java程序中,调用C语言函数库中提供的函数,来完成一些Java语言无法完成的任务。由于Java语言和C语言结构完全不相同,因此若想让它们二者交互,则需要制定一系列的规范JNI就是这组规范,此时 Java只和JNI交互,而由JNI去和C语言交互。

 

JNI技术分为两部分:JavaC语言端。且Java端为主导

|-  首先,Java程序员在Java端定义一些Native方法,并将这些方法C语言头文件的方式提供给C程序员

|-  然后,C程序员使用C语言,来实现Java程序员提供的头文件中定义的函数

|-  接着,C程序员将函数打包成一个库文件,并将库文件交给Java程序员

|-  最后,Java程序员Java程序中导入库文件,然后调用native方法。

 

Java程序执行的时候,若在某个类中调用了native方法,则虚拟机会通过JNI转调用库文件中的C语言代码提示:C代码最终是在Linux进程中执行的,而不是在虚拟机中


 

问题:在Android中可执行的文件,在Linux中一定可以执行吗? arm处理的linux下是可以的,但是在x86下就不一定可以执行;

那为什么要说,NDK会交叉编译。


登录模块:
可以借鉴<JNI开发&调试总结(用ADT纯开发JNI)>一文中的一键onekey-javah和onekey-ndk方便快捷生成头文件和编译.so库;
但目前调试还是用打印log为好;


表示用一键NDK命令成功:


压力锅:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include"com_zsy_jni_combat_monitor_MonitorAct.h"
#include <android/log.h>
#define LOG_TAG "log.samy.from.c"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
int getpressure() {
    // c语言中的随机数
    return rand();
}
JNIEXPORT jint JNICALL Java_com_zsy_jni_combat_monitor_MonitorAct_getPressure(JNIEnv * env, jobject obj) {
    return getpressure();
}  

音频转换(wav----->mp3格式可以压缩近10倍)
基础必备
(1)多媒体之音频格式:
简介
关于音频压缩,编码和解码的定义有很多含混的概念。 这部分文字将对关于音频编码等概念进行概要的介绍 
音频压缩的目的
直到音频压缩技术出现,以往存储高品质数字音频数据占用了大量的硬盘空间。 举个简单的例子: 
假设你要采样1分钟你所喜欢的歌存并储在硬盘 因为要获得CD音质,你使用44.1kHz采样率,立体声,16比特模式采样。 
44100 Hz 表示每秒钟将采样44100 个数值输入到你的声卡。 因为有2个声道,所以还要把这个数值乘以并且再乘以另一个数值 2,因为每个数值占有2字节(byte)空间(这就是16位的意思) 最终,这首1分钟的歌将占用 44100 samples/s*2 channels*2 bytes/sample*60 s/min约等于10Mbytes 硬盘空间。 
如用你想使用56k moden 在网络上下载这样一个仅仅1分钟的音频文件,将花费约30分钟——仅仅是下载1分钟的音乐。 
本文中的数字音频编码或称作数字音频压缩是一门将音频存储空间(通道波段带宽)最小化的艺术。 现在可感知音频编码技术(例如MPEG LayerIII)利用了人耳的特点(对声音的感知)在稍微或者不损失可感知音质的条件下将文件大小缩小了11倍。因此,这种计划是追求高质量低比特率的核心技术程序,例如游戏的音轨,数字录音机,网络音乐,数字网络广播系统等。 

音频压缩的两部分
音频压缩实际上包含两个部分。 第一部分被称之为编码,这是一个将数字音频数据(通常为WAVE文件)转为被称为比特流(bitstream)的高压缩形式。 如果你要在声卡上播放这种比特流,你需要进行另一部分操作——被称为解码 解码将比特流重新放大还原成WAVE文件。 
实现第一部分效果的程序被称为编码器。 LAME就是这样一个编码器。 实现第二部分效果的程序被称为解码器。 Xmms就是一个著名的MPEG3解码器,另外还有 mpg123。 你可以在www.mp3-tech.org 上找到它们。 
压缩比例,比特率和音质
至此一直没有明确提到的以下问题: 最终被编码再解码后的文件并不是与原来相同的声音文件。 可以说所有含有信息量的数据被压榨出来, 两者不是相同的文件,但是它们或多或少听起来是一样的,关键取决于你压缩程度的高低。 
通常说来,使用较低的压缩比例,获得的音质比较好,反之亦然。 表1.1将列出了不同压缩比例可获得的音效概况 
因为压缩比例这种说法往往不好度量,当涉及到压缩强度的时候专业人员会使用比特率这一概念。 比特率表示一秒钟压缩音频流所占用的平均比特数。 通常使用kbps作为单位,写作kbits/s,或者1000 bits/s 。如果要计算音频文件每秒钟所占用的字节数,可以简单的将其每秒钟的比特数除以8获得。
表 1.1 比特率对应音质
比特率    带宽    类似或更好的音质
16 kbps  4.5 kHz 短波收音
32 kbps 7.5 kHz 调频收音
96 kbps 11 kHz 调频立体声
128 kbps 16 kHz 接近于CD
160-180 kbps 20 kHz 可感觉到声场
(变动比特率)
256 kbps 22 kHz 工作室

一些命令行样例
? 128kbps 固定比特率编码
lame sample.wav sample.mp3
? 128kbps固定比特率联合立体声编码,高音质(推荐):
lame -h sample.wav sample.mp3
? 112kbps 平均比特率编码
lame --abr 112 sample.wav sample.mp3
快速编码,低音质(忽略精神声学分析)
lame -f sample.wav sample.mp3
变动比特率(使用 –V n 调节音质/文件容量)
lame -h -V 6 sample.wav sample.mp3
原始pcm单声道输出22.05kHz24kbps: 
cat inputfile | lame -r -m m -b 24 -s 22.05 -- > output
? 44.1kHz原始单声道pcm向下采样到22.05kHz
cat inputfile | lame -r -m m -b 24 --resample 22.05 -- > output

————————————————————————————————————
固定比特率/平均比特率/变动比特率 3种编码模式
LAME可以用它的3种编码模式对你的音乐文件进行编码操作: 固定比特率(CBR,平均比特率(ABR)和变动比特率(VBR.

固定比特率(CBR
这是一种固定编码模式,也是最基本的模式 在这种模式中,比特率在整个文件中保持一致。 这就意味着你的mp3文件中的每一部分将在压缩是使用相同的位数。 编码一段复杂的音乐片段或是简单的音乐片段的时候,编码器将使用相同的比特率,所以这段mp3的音质是变动的。 复杂部分的音质将低于简单部分的。 这种模式的最大优势在于文件最终的大小不会变动而且可以精确计算出。

平均比特率(ABR
在这种模式下,你可以制定一种预定的比特率,编码器将试着不断维持这种平均比特率同时在你的音乐的某些片断需要更高数位压缩的时候使用较高的比特率。 这种编码的音质将比CBR编码好,而且最终文件的平均大小仍然可以预测,因此比起CBR模式,我们高度推荐这种编码模式。

变动比特率(VBR
在这种模式中,你可以在0(高音质/低变形)至9(低音质/高变形)之间制定你希望的音质效果。 编码器在压缩你的音乐时选择最佳的比特数对应于其每一部分,从而尽可能维持整个文件符合说给定的音质。 这种编码模式的最大优点在于你能够指定你所希望达到的音质等级,但是问题在于这样将使最终的文件大小完全不可预知。

嵌入式预设指令

Lame 构造了一些嵌入式预设。 这些预设是为了提供尽可能最高的音质而设计的。
它们大多经历了严格的听觉测试调试与检测,并且实现了这一设计目的。 为了符合最新的发展,这些预设不断的更新,LAME将尽可能为你提供现在最佳的音质。

如果你对音质很苛求,强烈推荐你使用这些预设而非其它任何你可能使用的自定义参数。 如果要调用预设,请用以下格式:
lame --preset 预设名称

变动比特率模式
--preset medium
对于大多数人和大多数音乐来说,这种预设将提供几乎非常清晰的声音。
根据音乐的复杂程度,最终的压缩比特率将被控制在150-180kbps 之间。
--preset standard
对绝大多数人和音乐来说,这个预设通常会提供清晰的高音质的音乐。
根据音乐的复杂程度,最终的压缩比特率将被控制在170-210kbps 之间。
--preset extreme
如果你有一个金耳朵并且有相当好的播放设备,这种预设将能提供比"standard"模式稍微更好一点的音质。
根据音乐的复杂程度,最终的压缩比特率将被控制在200-240kbps 之间。
使用新的VBR算法的话,任何以上VBR预设也可以使用快速模式。 用这种模式编码将快一点,但它的音质将略微差一点。 如果要使用快速模式,请使用以下参数:
lame --preset fast preset_name

固定比特率 320kbps
--preset insane
这种预设通常远远高于决大多数人通常所需要的标准,但是如果你一定要追求这种绝对高的音质而且不在乎它所占用的文件大小,这是你的最好选择。 这是所有可用预设中最高音质的预设模式。

平均比特率模式
--preset <kbps>
使用这种预设将在指定比特率的基础上给你提供最佳音质。 根据你输入的比特率,该模式将为这个特定的要求决定最优参数设置。
在实现过程中,该预设不会像VBR模式一样灵活,而且在较高比特率时通常不会达到与VBR模式一样高的音质。
如果你想使用固定比特率模式编码,这些预设同样适用于CBR模式,请使用以下格式:
lame --preset cbr <kbps>

(2)数据与文件格式
0011  
图片
声音
视频 

图片格式如下:


windows下 文件类型的区别是 文件的扩展名
.jpg 
.bmp
.gif

.mp3
.wav

.mp4
.rmvb

第二道防线就是文件文件头 
1.读文件头( 记录文件的大小 ,文件格式, 文件的编码方式);
头部有ELF代表的是可以在liunx可以执行的文件;
MZ microsoft z 
不同格式的文件如何存储
jpg 图形规范: 图片压缩 
bmp
声音
wav 无损的音频格式 
mic 硬件设备 -产生电流 -> pcm 音频裸数据 ->wav 的文件
mp3 ->声音的压缩算法. winrar 7-zip  000000000000 -> 1万个0
mp3文件头 每一帧大小为 crc32 校验
视频 声音 图片.
mpeg mp4 3gp
rm 
rmvb 
(3)lame移植步骤:
  1. 解压libmp3lame 到jni目录. 
  2. 拷贝 lame.h 
  3. 创建Android.mk 

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := mp3lame_samy
LOCAL_SRC_FILES := bitstream.c fft.c id3tag.c mpglib_interface.c presets.c  quantize.c   reservoir.c tables.c  util.c  VbrTag.c encoder.c  gain_analysis.c lame.c  newmdct.c   psymodel.c quantize_pvt.c set_get.c  takehiro.c vbrquantize.c version.c combat_lame.c(自己的.c文件放在其他LameLib的后面)
include $(BUILD_SHARED_LIBRARY)

(1)删除 GNU autotools, Makefile.am Makefile.in libmp3lame_vc8.vcproj logoe.ico depcomp, folders i386 等无用文件,有关makefile的文件删除掉,要不然会出现禁止访问make.**错误;
(2)编辑 jni/utils.h, 
把 extern ieee754_float32_t fast_log2(ieee754_float32_t x);
替换为 extern float fast_log2(float x);
(3)一定要记得给当前Android项目配置读写SDCard的权限;

那些地方用到音频转码的案例:
  1. 把一些照片 用户说的话做成一个视频;
  2. android 录音机只能pcm的数据 amr格式;
  3. pcm格式 wav的数据->MP3;
  4. jave java audio video encoder;
  5. 寻找c的代码库 实现音频转码;
  6. lame 编码器 开源高效的MP3的编码器;
  7. 千千静听;
开发流程图:

Lame官网下载地址:
http://lame.sourceforge.net/download.php  
http://sourceforge.net/projects/lame/files/lame/3.99/ 
使用例子方法类:


关键类位置:

查看版本:
(1):查看开发工具的版本号:

(2):查看Lame的版本号:(ps:都多次clean下才能正常编译编出.so库)

//1.初始化lame的编码器
        lame_t lame =  lame_init();
        //2. 设置lame mp3编码的采样率
        lame_set_in_samplerate(lame , 44100);
        lame_set_num_channels(lame,2);
        // 3. 设置MP3的编码方式
        lame_set_VBR(lame, vbr_default);
        lame_init_params(lame);  

进度条显示:
(1):假的进度条
2M wav -> 200K;
99%~100%;
(2):真的进度条
准确的知道 转化的百分比;

/**
 * 注意方法应放到前面,不用再去头文件中申明;
 */
void publishJavaProgress(JNIEnv * env, jobject obj, jint progress) {
    // 调用java代码 更新程序的进度条
// 1.找到java的LameActivity的class
    //  jclass      (*FindClass)(JNIEnv*, const char*);
    jclass clazz = (*env)->FindClass(env, "com/zsy/jni/combat/lame/LameAct");
    if (clazz == 0) {
        LOGI("can‘t find clazz");
    }
    LOGI(" find clazz");
    //2 找到class 里面的方法定义
//    jmethodID   (*GetMethodID)(JNIEnv*, jclassconst 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);
}
/*
 * Class:     com_zsy_jni_combat_lame_LameAct
 * Method:    convertmp3
 * Signature: (Ljava/lang/String;Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_com_zsy_jni_combat_lame_LameAct_convertmp3
(JNIEnv * env, jobject obj , jstring jwav, jstring jmp3) {
    char* cwav =Jstring2CStr(env,jwav);
    char* cmp3=Jstring2CStr(env,jmp3);
    LOGI("wav = %s", cwav);
LOGI("mp3 = %s", cmp3);
//1.打开 wav,MP3文件
FILE* fwav = fopen(cwav,"rb");
        FILE* fmp3 = fopen(cmp3,"wb");
        short int wav_buffer[8192*2];//1024*8;
        unsigned char mp3_buffer[8192];//1024*8;
        //1.初始化lame的编码器
        lame_t lame =  lame_init();
        //2. 设置lame mp3编码的采样率
        lame_set_in_samplerate(lame , 44100);
        lame_set_num_channels(lame,2);
        // 3. 设置MP3的编码方式
        lame_set_VBR(lame, vbr_default);
        lame_init_params(lame);
        LOGI("lame init finish");
int read ; int write; //代表读了多少个次 和写了多少次
        int total=0; // 当前读的wav文件的byte数目
        do{
            if(flag==404){
                return;
            }
            read = fread(wav_buffer,sizeof(short int)*2, 8192,fwav);
            total +=  read* sizeof(short int)*2;
            LOGI("converting ....%d", total);
publishJavaProgress(env,obj,total);
            // 调用java代码 完成进度条的更新
            if(read!=0){
                write = lame_encode_buffer_interleaved(lame,wav_buffer,read,mp3_buffer,8192);
                //把转化后的mp3数据写到文件里
                fwrite(mp3_buffer,sizeof(unsigned char),write,fmp3);
            }
            if(read==0){
                lame_encode_flush(lame,mp3_buffer,8192);
            }
        }while(read!=0);
        LOGI("convert  finish");
lame_close(lame);
fclose(fwav);
fclose(fmp3);
} 

FFMPEG开源项目:

ffmpeg 获取视频 音频 :

ffmpeg -i F:\VideoConverter\123.avi F:\VideoConverter\123.mp3

ps:当前路径直接写;ffmpeg -i 123.avi 123.mp3

 

ffmpeg 视频转换:

ffmpeg -y -i F:\VideoConverter\123.avi  -ab 56 -ar 22050 -b 1500 -r 15 -qscale 10 -s 480x350  F:\VideoConverter\234.flv

 

ffmpeg截图:

ffmpeg -i F:\VideoConverter\123.flv -y -f image2 -t 0.05 -s 480x350 ss 8 F:\VideoConverter\234.jpg

-ss 8 截第8

 

Mencoder 视频转换参数:

-i F:\VideoConverter\123.avi -o F:\VideoConverter\234.flv + " -of lavf -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavcopts vcodec=flv:vbitrate=150:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -vf scale=480:-3 -ofps 12 -srate 22050";

 

删除网站中相对路径下的某一文件:
  File.Delete(Server.MapPath("img/Sunset.jpg"));
  PK:ServerMapPath方法是返回web服务器上的指定虚拟路径相对应的物理文件路径


删除网站中相对路径下的某一文件夹:
  Directory.Delete(Server.MapPath("img"),true);

 

前台传值后台接

前台传值

XXX.aspx?id= ???? 

后台接收

String a= Request.QueryString["id"].ToString().Trim();

 

后台传值前台接

String a="XXXX";

??赋值对象?? = <%=a%>

 

Datalist删除一条记录的解决方法 

datalist不同gridView Findcontrol方法行不通。

设置DataListDataKeyField=主键,ButtonCommandName="Delete"
DataListItemCommand的事件里面:
ItemCommand:
if (e.CommandName=="Delete")
{
int ID =(int)DataList1.DataKeys[e.Item.Itemindex]
//int就是要删的主键,删除这条纪录就行了

protected void DataList1_ItemCommand(object source, DataListCommandEventArgs e)
    {
        if (e.CommandName == "Delete")
        {
            int id = (int)DataList1.DataKeys[e.Item.ItemIndex];
            Response.Write(id);
        }

}


D:\samy\projects\24jni\音频转码>ffmpeg -i test_a.avi test_a.mp3
    

D:\samy\projects\24jni\音频转码>ffmpeg -y -i test_a.avi  -ab 56 -ar 22050 -b 15

0 -r 15 -qscale 10 -s 480x350 test_a_new.flv

FFmpeg version UNKNOWN, Copyright (c) 2000-2008 Fabrice Bellard, et al.

  configuration: --disable-shared --enable-memalign-hack --enable-gpl --cpu=i68

 --enable-libfaac --enable-libfaad --enable-libxvid --enable-liba52 --enable-li

amr-nb --enable-libamr-wb

  libavutil     49. 9. 0 / 49. 9. 0

  libavcodec    51.64. 0 / 51.64. 0

  libavformat   52.20. 0 / 52.20. 0

  libavdevice   52. 1. 0 / 52. 1. 0

  built on Sep  4 2008 17:14:49, gcc: 4.2.1-sjlj (mingw32-2)

Input #0, avi, from ‘test_a.avi‘:

  Duration: 00:19:53.00, start: 0.000000, bitrate: 153 kb/s

    Stream #0.0: Video: camtasia, bgr24, 1280x800,  6.00 tb(r)

    Stream #0.1: Audio: mp3, 48000 Hz, mono, s16, 64 kb/s

WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not

kbits/s

[imgconvert @ 00E0CE90]PIX_FMT_YUV420P will be used as an intermediate format f

r rescaling

Output #0, flv, to ‘test_a_new.flv‘:

    Stream #0.0: Video: flv, yuv420p, 480x350, q=2-31, 1 kb/s, 15.00 tb(c)

    Stream #0.1: Audio: adpcm_swf, 22050 Hz, mono, s16, 0 kb/s

Stream mapping:

  Stream #0.0 -> #0.0

  Stream #0.1 -> #0.1

Press [q] to stop encoding

frame= 1567 fps=259 q=10.0 size=    2913kB time=104.47 bitrate= 228.4kbits/s

frame= 1700 fps=259 q=10.0 size=    3166kB time=113.33 bitrate= 228.9kbits/s

frame= 1827 fps=259 q=10.0 size=    3425kB time=121.80 bitrate= 230.3kbits/s

frame= 1962 fps=260 q=10.0 size=    3664kB time=130.80 bitrate= 229.5kbits/s

frame= 2095 fps=260 q=10.0 size=    3918kB time=139.67 bitrate= 229.8kbits/s

frame= 2227 fps=260 q=10.0 size=    4168kB time=148.47 bitrate= 230.0kbits/s

frame= 2365 fps=261 q=10.0 size=    4432kB time=157.67 bitrate= 230.3kbits/s

frame= 2495 fps=261 q=10.0 size=    4686kB time=166.33 bitrate= 230.8kbits/s

frame= 2628 fps=261 q=10.0 size=    4939kB time=175.20 bitrate= 231.0kbits/s

frame= 2763 fps=261 q=10.0 size=    5194kB time=184.20 bitrate= 231.0kbits/s

frame= 2895 fps=261 q=10.0 size=    5450kB time=193.00 bitrate= 231.3kbits/s

frame= 3027 fps=261 q=10.0 size=    5708kB time=201.80 bitrate= 231.7kbits/s

frame= 3165 fps=262 q=10.0 size=    5948kB time=211.00 bitrate= 230.9kbits/s

frame= 3300 fps=262 q=10.0 size=    6193kB time=220.00 bitrate= 230.6kbits/s

frame= 3432 fps=262 q=10.0 size=    6460kB time=228.80 bitrate= 231.3kbits/s

frame= 3565 fps=262 q=10.0 size=    6743kB time=237.67 bitrate= 232.4kbits/s

frame= 3693 fps=262 q=10.0 size=    6991kB time=246.20 bitrate= 232.6kbits/s

frame= 3825 fps=262 q=10.0 size=    7217kB time=255.00 bitrate= 231.8kbits/s

frame= 3957 fps=262 q=10.0 size=    7445kB time=263.80 bitrate= 231.2kbits/s

frame= 4083 fps=262 q=10.0 size=    7706kB time=272.20 bitrate= 231.9kbits/s

frame= 4215 fps=262 q=10.0 size=    7967kB time=281.00 bitrate= 232.3kbits/s

frame= 4347 fps=262 q=10.0 size=    8218kB time=289.80 bitrate= 232.3kbits/s

frame= 4475 fps=261 q=10.0 size=    8465kB time=298.33 bitrate= 232.4kbits/s

frame= 4602 fps=261 q=10.0 size=    8702kB time=306.80 bitrate= 232.4kbits/s

frame= 4730 fps=261 q=10.0 size=    8958kB time=315.33 bitrate= 232.7kbits/s

frame= 4860 fps=261 q=10.0 size=    9211kB time=324.00 bitrate= 232.9kbits/s

frame= 4992 fps=261 q=10.0 size=    9466kB time=332.80 bitrate= 233.0kbits/s

frame= 5118 fps=261 q=10.0 size=    9702kB time=341.20 bitrate= 232.9kbits/s

frame= 5242 fps=260 q=10.0 size=   10015kB time=349.47 bitrate= 234.8kbits/s

frame= 5370 fps=260 q=10.0 size=   10405kB time=358.00 bitrate= 238.1kbits/s

frame= 5493 fps=260 q=10.0 size=   10720kB time=366.20 bitrate= 239.8kbits/s

frame= 5617 fps=259 q=10.0 size=   11060kB time=374.47 bitrate= 242.0kbits/s

frame= 5737 fps=259 q=10.0 size=   11468kB time=382.47 bitrate= 245.6kbits/s

frame= 5857 fps=259 q=10.0 size=   11862kB time=390.47 bitrate= 248.9kbits/s

frame= 5975 fps=258 q=10.0 size=   12256kB time=398.33 bitrate= 252.0kbits/s

frame= 6097 fps=258 q=10.0 size=   12652kB time=406.47 bitrate= 255.0kbits/s

frame= 6215 fps=257 q=10.0 size=   13041kB time=414.33 bitrate= 257.8kbits/s

frame= 6327 fps=256 q=10.0 size=   13403kB time=421.80 bitrate= 260.3kbits/s

frame= 6442 fps=256 q=10.0 size=   13771kB time=429.47 bitrate= 262.7kbits/s

frame= 6567 fps=256 q=10.0 size=   14192kB time=437.80 bitrate= 265.6kbits/s

frame= 6693 fps=256 q=10.0 size=   14586kB time=446.20 bitrate= 267.8kbits/s

frame= 6815 fps=255 q=10.0 size=   15005kB time=454.33 bitrate= 270.5kbits/s

frame= 6970 fps=256 q=10.0 size=   15441kB time=464.67 bitrate= 272.2kbits/s

frame= 7105 fps=257 q=10.0 size=   15765kB time=473.67 bitrate= 272.7kbits/s

frame= 7240 fps=257 q=10.0 size=   16051kB time=482.67 bitrate= 272.4kbits/s

frame= 7355 fps=256 q=10.0 size=   16334kB time=490.33 bitrate= 272.9kbits/s

frame= 7477 fps=256 q=10.0 size=   16651kB time=498.47 bitrate= 273.7kbits/s

frame= 7608 fps=256 q=10.0 size=   16968kB time=507.20 bitrate= 274.1kbits/s

frame= 7740 fps=256 q=10.0 size=   17211kB time=516.00 bitrate= 273.2kbits/s

frame= 7870 fps=256 q=10.0 size=   17522kB time=524.67 bitrate= 273.6kbits/s

frame= 8000 fps=256 q=10.0 size=   17818kB time=533.33 bitrate= 273.7kbits/s

frame= 8125 fps=256 q=10.0 size=   18206kB time=541.67 bitrate= 275.3kbits/s

frame= 8253 fps=256 q=10.0 size=   18542kB time=550.20 bitrate= 276.1kbits/s

frame= 8382 fps=256 q=10.0 size=   18864kB time=558.80 bitrate= 276.5kbits/s

frame= 8517 fps=256 q=10.0 size=   19128kB time=567.80 bitrate= 276.0kbits/s

frame= 8650 fps=257 q=10.0 size=   19389kB time=576.67 bitrate= 275.4kbits/s

frame= 8780 fps=257 q=10.0 size=   19653kB time=585.33 bitrate= 275.0kbits/s

frame= 8913 fps=257 q=10.0 size=   19916kB time=594.20 bitrate= 274.6kbits/s

frame= 9042 fps=257 q=10.0 size=   20178kB time=602.80 bitrate= 274.2kbits/s

frame= 9175 fps=257 q=10.0 size=   20442kB time=611.67 bitrate= 273.8kbits/s

frame= 9305 fps=257 q=10.0 size=   20726kB time=620.33 bitrate= 273.7kbits/s

frame= 9435 fps=257 q=10.0 size=   20994kB time=629.00 bitrate= 273.4kbits/s

frame= 9567 fps=257 q=10.0 size=   21273kB time=637.80 bitrate= 273.2kbits/s

frame= 9680 fps=257 q=10.0 size=   21514kB time=645.33 bitrate= 273.1kbits/s

frame= 9813 fps=257 q=10.0 size=   21807kB time=654.20 bitrate= 273.1kbits/s

frame= 9942 fps=257 q=10.0 size=   22094kB time=662.80 bitrate= 273.1kbits/s

frame=10077 fps=257 q=10.0 size=   22386kB time=671.80 bitrate= 273.0kbits/s

frame=10210 fps=257 q=10.0 size=   22682kB time=680.67 bitrate= 273.0kbits/s

frame=10345 fps=257 q=10.0 size=   22992kB time=689.67 bitrate= 273.1kbits/s

frame=10477 fps=257 q=10.0 size=   23283kB time=698.47 bitrate= 273.1kbits/s

frame=10608 fps=257 q=10.0 size=   23580kB time=707.20 bitrate= 273.1kbits/s

frame=10740 fps=257 q=10.0 size=   23877kB time=716.00 bitrate= 273.2kbits/s

frame=10875 fps=257 q=10.0 size=   24178kB time=725.00 bitrate= 273.2kbits/s

frame=11010 fps=257 q=10.0 size=   24472kB time=734.00 bitrate= 273.1kbits/s

frame=11142 fps=258 q=10.0 size=   24768kB time=742.80 bitrate= 273.2kbits/s

frame=11275 fps=258 q=10.0 size=   25062kB time=751.67 bitrate= 273.1kbits/s

frame=11407 fps=258 q=10.0 size=   25357kB time=760.47 bitrate= 273.2kbits/s

frame=11538 fps=258 q=10.0 size=   25653kB time=769.20 bitrate= 273.2kbits/s

frame=11670 fps=258 q=10.0 size=   25949kB time=778.00 bitrate= 273.2kbits/s

frame=11802 fps=258 q=10.0 size=   26245kB time=786.80 bitrate= 273.3kbits/s

frame=11932 fps=258 q=10.0 size=   26537kB time=795.47 bitrate= 273.3kbits/s

frame=12063 fps=258 q=10.0 size=   26829kB time=804.20 bitrate= 273.3kbits/s

frame=12187 fps=258 q=10.0 size=   27102kB time=812.47 bitrate= 273.3kbits/s

frame=12315 fps=258 q=10.0 size=   27389kB time=821.00 bitrate= 273.3kbits/s

frame=12435 fps=257 q=10.0 size=   27654kB time=829.00 bitrate= 273.3kbits/s

frame=12562 fps=257 q=10.0 size=   27923kB time=837.47 bitrate= 273.1kbits/s

frame=12687 fps=257 q=10.0 size=   28206kB time=845.80 bitrate= 273.2kbits/s

frame=12807 fps=257 q=10.0 size=   28470kB time=853.80 bitrate= 273.2kbits/s

frame=12927 fps=257 q=10.0 size=   28733kB time=861.80 bitrate= 273.1kbits/s

frame=13040 fps=257 q=10.0 size=   28978kB time=869.33 bitrate= 273.1kbits/s

frame=13155 fps=256 q=10.0 size=   29238kB time=877.00 bitrate= 273.1kbits/s

frame=13287 fps=256 q=10.0 size=   29532kB time=885.80 bitrate= 273.1kbits/s

frame=13413 fps=256 q=10.0 size=   29805kB time=894.20 bitrate= 273.1kbits/s

frame=13540 fps=256 q=10.0 size=   30095kB time=902.67 bitrate= 273.1kbits/s

frame=13670 fps=256 q=10.0 size=   30385kB time=911.33 bitrate= 273.1kbits/s

frame=13800 fps=256 q=10.0 size=   30682kB time=920.00 bitrate= 273.2kbits/s

frame=13917 fps=256 q=10.0 size=   30933kB time=927.80 bitrate= 273.1kbits/s

frame=14052 fps=256 q=10.0 size=   31248kB time=936.80 bitrate= 273.3kbits/s

frame=14185 fps=256 q=10.0 size=   31547kB time=945.67 bitrate= 273.3kbits/s

frame=14305 fps=256 q=10.0 size=   31822kB time=953.67 bitrate= 273.4kbits/s

frame=14420 fps=256 q=10.0 size=   32075kB time=961.33 bitrate= 273.3kbits/s

frame=14550 fps=256 q=10.0 size=   32370kB time=970.00 bitrate= 273.4kbits/s

frame=14677 fps=256 q=10.0 size=   32663kB time=978.47 bitrate= 273.5kbits/s

frame=14805 fps=256 q=10.0 size=   32936kB time=987.00 bitrate= 273.4kbits/s

frame=14808 fps=253 q=10.0 size=   32956kB time=987.20 bitrate= 273.5kbits/s

frame=14935 fps=253 q=10.0 size=   33229kB time=995.67 bitrate= 273.4kbits/s

frame=15063 fps=253 q=10.0 size=   33528kB time=1004.20 bitrate= 273.5kbits/s

frame=15183 fps=253 q=10.0 size=   33814kB time=1012.20 bitrate= 273.7kbits/s

frame=15310 fps=253 q=10.0 size=   34080kB time=1020.67 bitrate= 273.5kbits/s

frame=15442 fps=253 q=10.0 size=   34356kB time=1029.47 bitrate= 273.4kbits/s

frame=15573 fps=253 q=10.0 size=   34631kB time=1038.20 bitrate= 273.3kbits/s

frame=15702 fps=253 q=10.0 size=   34900kB time=1046.80 bitrate= 273.1kbits/s

frame=15815 fps=253 q=10.0 size=   35143kB time=1054.33 bitrate= 273.1kbits/s

frame=15935 fps=253 q=10.0 size=   35392kB time=1062.33 bitrate= 272.9kbits/s

frame=16062 fps=253 q=10.0 size=   35664kB time=1070.80 bitrate= 272.8kbits/s

frame=16188 fps=253 q=10.0 size=   35943kB time=1079.20 bitrate= 272.8kbits/s

frame=16315 fps=253 q=10.0 size=   36223kB time=1087.67 bitrate= 272.8kbits/s

frame=16445 fps=253 q=10.0 size=   36511kB time=1096.33 bitrate= 272.8kbits/s

frame=16565 fps=253 q=10.0 size=   36770kB time=1104.33 bitrate= 272.8kbits/s

frame=16698 fps=253 q=10.0 size=   37021kB time=1113.20 bitrate= 272.4kbits/s

frame=16833 fps=253 q=10.0 size=   37256kB time=1122.20 bitrate= 272.0kbits/s

frame=16955 fps=253 q=10.0 size=   37491kB time=1130.33 bitrate= 271.7kbits/s

frame=17082 fps=253 q=10.0 size=   37745kB time=1138.80 bitrate= 271.5kbits/s

frame=17205 fps=253 q=10.0 size=   38001kB time=1147.00 bitrate= 271.4kbits/s

frame=17330 fps=253 q=10.0 size=   38271kB time=1155.33 bitrate= 271.4kbits/s

frame=17460 fps=253 q=10.0 size=   38545kB time=1164.00 bitrate= 271.3kbits/s

frame=17592 fps=253 q=10.0 size=   38818kB time=1172.80 bitrate= 271.1kbits/s

frame=17722 fps=253 q=10.0 size=   39074kB time=1181.47 bitrate= 270.9kbits/s

frame=17847 fps=253 q=10.0 size=   39342kB time=1189.80 bitrate= 270.9kbits/s

frame=17892 fps=253 q=10.0 Lsize=   39450kB time=1192.80 bitrate= 270.9kbits/s


video:25850kB audio:12919kB global headers:0kB muxing overhead 1.757054%


D:\samy\projects\24jni\音频转码>




纯c语言开发程序 (在普通android 开发里面用的不多.

1.下载编译器和链接器软件.Sourcery G++ Lite Edition for ARM.
arm-none-linux-gnueabi-gcc.exe是编译命令
bin/arm-none-linux-gnueabi-ld.exe是链接命令
2.编写c源文件
#include <stdio.h>
int main()
{
printf("Hello, Android!\n");
return 0;
}
3.编译hello.c源文件
进入cmd
执行 arm-none-linux-gnueabi-gcc HelloWorld.c -static -o hellostatic
4.将hellostatic文件传输手机
adb push hellostatic /data/c/
5.改变文件的授权
adb shell chmod 777 /data/c/hellostatic
6.运行程序
adb shell
cd /data/c
./hellostatic (此时hellostatic肯定是ELF开头的)
7.查看执行结果
这里其实可以写一个apk去执行.so文件;

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        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();
        }
    }   
可以用代码直接运行 shell@mx3:/system/bin $ ls   /system/bin下的全部命令;



安装时PS:
Sourcery G++ Lite Edition for ARM好像现在不支持W8;


Eclipse+Sourcery G++ Lite for ARM EABI的安装

Eclipse 主要是一个 Java 开发环境,但其体系结构确保了对其它编程语言的支持。笔者将介绍如何配置Eclipse使用 C/C++ 开发工具箱(C/C++ Development Toolkit,CDT)结合Sourcery G++ Lite for ARM EABI 的编译环境进行ARM嵌入式系统开发。
首先我们下载Eclipse IDE for C/C++ Developers开发环境,它集成了Eclipse和CDT工具箱。在安装Eclipse之前必须安装JAVA JDK,然后直接解压缩Eclipse即可运行Eclipse开发软件。下载地址Eclipse IDE for C/C++ Developers。
第二步:在Eclipse开发软件下安装ARM公司的Eclipse插件具体步骤如下:在菜单栏中选择Help –> Install New Software在work with上输入如下地址: http://gnuarmeclipse.sourceforge.net/updates ,几秒后Eclipse链接服务器加载并会显示出一个选项 GNU ARM C/C++ Development Support,在它前面打勾。另外不能选择“Group items by category”选项,然后点击Next。这样第二步就完成了。
第三步:安装Sourcery G + + Lite,ARM公司的Sourcery G + + Lite是一个完整的C / C + +开发环境,免费提供GNU工具链具有快速安装、能自动设置环境变量。点击下载http://www.codesourcery.com/sgpp/lite/arm/portal/release1039 选择IA32 Windows Installer (direct link)。直接安装、默认设置。安装成功后,我们在到安装目录c:\codesourcery\bin 下修改部分文件名称,让Eclipse能够找到这个文件,具体更改文件如下:
arm-none-linux-gnueabi-gcc.exe → arm-none-eabi-gcc.exe
arm-none-linux-gnueabi-gdb.exe → arm-none-eabi-gdb.exe
arm-none-linux-gnueabi-ld.exe → arm-none-eabi-ld.exe
arm-none-linux-gnueabi-objcopy.exe → arm-none-eabi-objcopy.exe
arm-none-linux-gnueabi-objdump.exe → arm-none-eabi-objdump.exe
arm-none-linux-gnueabi-size.exe → arm-none-eabi-size.exe
第四步:安装远程支持,在菜单栏Help –> Install New Software在 Work with 下拉菜单中选择All Available Sites. Eclipse链接服务器成功后加载安装文件,选择如下选项:
General Purpose Tools
Dynamic Languages Toolkit – Remote Development Support
Remote System Explorer End-User Runtime
Remote System Explorer User Actions
然后点击Next,下一步安装。
经过上面的设置,我们可以在File菜单中新建Sourcery G++ Lite工程,并能执行编译与链接。

adb导入程序并执行 命令

一.导入程序:

1.将adb工具所在的环境变量加入path中,这样方便直接使用

2.列出所有目录文件:adb shell ls  (如 adb -s emulator-5554 shell ls /data 列出emulator-5554模拟器指定目录data文件)(注意360手机助手可能会占用端口,提示ADB出现adb server is out of date, killing,后台关闭即可 

3.创建文件夹: adb shell mkdir /data/c 

3.导入文件命令:adb  push 某路径文件 目标路径  (如 adb push c:/hello  /data/c ) 

二.执行某文件夹下的程序

1.cmd 输入 adb shell,进入 shell 

2.进入指定目录 cd /data/c/

3.改变文件权限:chmod 777 hello  (7代表 二进制的 111 ,即3个7 各自代表 属主,属组,其他的 权限 都为 可读 ,可写,可执行)

4.运行程序:./hello





 







来自为知笔记(Wiz)


JNI开发案例开发总结