2 g08176 g08176 于 2016.04.18 17:26 提问

如何在Android 下用jni调用下面c代码进行g711编码?
jni

unsigned char encode(short pcm);
short decode(unsigned char alaw);

/** 个人理解

  • bitsize 应该为16, pBuffer(pcm数据) 两个char 合成一个 short ,长度自然就是原来的一半(nBufferSize/2),
  • 通过编码后short类型的数据变为char类型,让后复制给pCodecBits
    /
    int g711_encode(unsigned char
    pCodecBits, const char* pBuffer, int nBufferSize)
    {
    short* buffer = (short*)pBuffer;
    int i;
    for(i=0; i<nBufferSize/2; i++)
    {
    pCodecBits[i] = encode(buffer[i]);
    }

    return nBufferSize/2;
    }

/** 个人理解

  • bitsize 应该为16, pcm 数组的宽度变为原来两倍(short out_data = (short)pRawData;),
  • 通过对pBuffer(g711数据)中char解码转为两个字节的short ,后复制给out_data数组, 在使用的时候又转为char类型, 则 解码后的数据就是原来的两倍(nBufferSize*2)
    /
    int g711_decode(char
    pRawData, const unsigned char* pBuffer, int nBufferSize)
    {
    short out_data = (short)pRawData;
    int i;
    for(i=0; i<nBufferSize; i++)
    {
    out_data[i] = decode(pBuffer[i]);
    }

    return nBufferSize*2;
    }

#define MAX 32635
unsigned char encode(short pcm)
{
int sign = (pcm & 0x8000) >> 8;
if (sign != 0)
pcm = -pcm;
if (pcm > MAX) pcm = MAX;
int exponent = 7;
int expMask;
for (expMask = 0x4000; (pcm & expMask) == 0
&& exponent>0; exponent--, expMask >>= 1) { }
int mantissa = (pcm >> ((exponent == 0) ? 4 : (exponent + 3))) & 0x0f;
unsigned char alaw = (unsigned char)(sign | exponent << 4 | mantissa);
return (unsigned char)(alaw^0xD5);
}

short decode(unsigned char alaw)
{
alaw ^= 0xD5;
int sign = alaw & 0x80;
int exponent = (alaw & 0x70) >> 4;
int data = alaw & 0x0f;
data <<= 4;
data += 8;
if (exponent != 0)
data += 0x100;
if (exponent > 1)
data <<= (exponent - 1);

return (short)(sign == 0 ? data : -data);

}

1个回答

CSDNXIAOD
CSDNXIAOD   2016.04.18 17:32

android中如何通过jni调用c,c++代码
Android JNI简单实例(android 调用C/C++代码)
Android JNI简单实例(android 调用C/C++代码)
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Android G711编解码
G.711 Android 编解码库源码
android h264视频编解码g711音频编解码JNI文件
android h264视频编解码g711音频编解码JNI文件,有C文件和CPP文件
G711编码原理及代码
G711编码的声音清晰度好,语音自然度高,但压缩效率低,数据量大常在32Kbps以上。常用于电话语音(推荐使用64Kbps),sampling rate为8K,压缩率为2,即把S16格式的数据压缩为8bit,分为a-law和u-law。 a-law也叫g711a,输入的是13位(其实是S16的高13位),使用在欧洲和其他地区,这种格式是经过特别设计的,便于数字设备进行快速运算。 运
Android:通过JNI调用c++代码
Android:通过JNI调用c++代码
【Android】Android中使用JNI调用底层C++代码
Android NDK是一系列工具的集合。帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。NDK集成了交叉编译器,并提供了相应的mk文件隔离平台、CPU、API等差异,只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so动态链接库文件JNI编译环境配置有2种方式来实现编译jni工程: 方法一: 在ADT的菜单window
Android使用JNI调用C代码的例子
这是一个在Android studio上写的一个Android 使用jni调用c代码的例子,详情请看我的博客地址:http://blog.csdn.net/qq_27512671/article/details/51149912
Android底层调用C代码(JNI实现)
Android底层调用C代码(JNI实现) 一、基础知识 二、从Android框架角度简单分析JNI 三、标准JNI实现步骤 四、实现JNI过程实例 一、基础知识 1、JNI:百度百科中解释:JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。 (然而就像官话一样难理解)。 个人理解,JNI就是一个
G711编码原理
在正常的语音通话中,信号幅值的分布并不均匀,小信号出现的概率往往大于大信号出现的概率。G.711 正是利用语音信号的这种特性采用非均匀量化编码。在量化的时候可以让量化区间在小信号的时候取较小,在大信号的时候取较大,这样就能有效提高量化的信噪比      首先将输入信号的幅度归一化便于分析,然后将信号分成不均匀的8个段落,每个段落长度基本以2倍的递增。每一段又再分成16份,每一份都代表一个量化级
Android下JNI入门详解
适合对JNI尚不了解的开发者。介绍如何在Android环境下使用JNI已达到java与C/C++函数互调,描述如何在VM中调用C/C++函数。
android G711 实时传输
通过组播,socket,将android实时采集的音频数据进行g711编码, 发送,然后接收再进行g711解码,实时播放采集的声音