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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!