UnsatisfiedLinkError AudioRecordNew

时间:2012-05-14 20:32:46

标签: android audio java-native-interface

尝试使用here中的代码 我试图合并这两个类,以便我最终得到一个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)我

     

05-14 14:46:48.552:W / dalvikvm(28658):threadid = 10:线程退出   未捕获的异常(组= 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):at   com.avispl.nicu.audio.MicrophoneInputStream.AudioRecordNew(母语   方法)

     

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

     

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

     

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

2 个答案:

答案 0 :(得分: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版本并继续。

答案 1 :(得分:0)

我认为现在不支持它 见here

  

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