1

尝试使用此处的代码 我试图合并这两个类,以便最终得到一个 ulaw 音频数据的 inputStream。所以我像这样编辑了 UlawEncoderInputStream:

private MicrophoneInputStream micIn;
public UlawEncoderInputStream() {
    mMax = 0;
    try {
            micIn = new MicrophoneInputStream(8000, 1);

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
}

然后尝试使用那个 UlawEncoderInputStream:

while(transmittingAudio) {
                        if(micInStream.available()>0) {
                            //              byte[] data = new byte[audioDump.available()];
                            int bytesRead = micInStream.read(data);
                            os.write(data,0,bytesRead);
                            os.flush();
                            //              ca.transmitAxisAudioPacket(data);
//                          System.out.println("read "+bytesRead);
                        }

但是,MicrophoneInputStream 底部的 JNI 本机语句似乎存在问题。

private static native int AudioRecordNew(int sampleRate, int fifoDepth);

错误:

05-14 14:46:48.544: W/dalvikvm(28658): 找不到本地 Lcom/avispl/nicu/audio/MicrophoneInputStream;.AudioRecordNew (II)I 的实现

05-14 14:46:48.552: W/dalvikvm(28658): threadid=10: 线程退出未捕获异常 (group=0x40018560)

05-14 14:46:48.552:E/AndroidRuntime(28658):致命异常:线程 12

05-14 14:46:48.552: E/AndroidRuntime(28658): java.lang.UnsatisfiedLinkError: AudioRecordNew

05-14 14:46:48.552:E/AndroidRuntime(28658):在 com.avispl.nicu.audio.MicrophoneInputStream.AudioRecordNew(本机方法)

05-14 14:46:48.552: E/AndroidRuntime(28658): 在 com.avispl.nicu.audio.MicrophoneInputStream.(MicrophoneInputStream.java:27)

05-14 14:46:48.552: E/AndroidRuntime(28658): 在 com.avispl.nicu.audio.UlawEncoderInputStream.(UlawEncoderInputStream.java:111)

05-14 14:46:48.552: E/AndroidRuntime(28658): 在 com.avispl.nicu.audio.AudioTransmitter.run(AudioTransmitter.java:66)

4

2 回答 2

1

对不起,如果这远低于您提出的问题的水平,我很累,我发现您的问题很难理解:

如果您尝试调用本机方法AudioRecordNew

您将需要static { System.loadLibrary("cLibraryName"); }加载您使用android-ndk\ Android.mk\构建的本机库Application.mk

并且您的c++文件(和h文件)将需要这样的方法:

JNIEXPORT void JNICALL Java_com_company_package_JavaFile_AudioRecordNew(JNIEnv* env, jobject obj, jint arg0, jint arg1)     
{

}

除非您有一个执行上述所有操作的本机库,否则您会收到一条错误消息,告诉您本机库不存在。(这看起来像您在这里遇到的问题,您没有示例中使用的 java 本机库)。

如果您可以获得本机库的源代码,但是您可以按照上述方法构建库的 android 版本并继续。

于 2012-05-16T14:24:31.737 回答
0

我相信它现在不受支持,请参见此处

很抱歉重复,但正如 Dianne 所说:“此时:SDK 中不支持本机代码。使用它可能会导致您的应用程序在交付手机更新时中断。使用 C++ API 肯定会导致你在未来打破。

于 2012-05-15T19:28:51.110 回答