我想在so部分调用java的某个函数,该函数的参数有byte[]等。
    部分的C代码如下:
     jmethodID java_method = (*env)->GetMethodID(env, java_class, "PlayAudio", "([BI)V");
if(java_method == 0)
{
return (*env)->NewStringUTF(env, "not find PalyAudio!");
}
char szTemp[20] ={0xff};
          (*env)->CallObjectMethod(env, java_obj, java_method, szTemp, 20);
        
        java中PlayAudio的原型为:
        public void PlayAudio(byte[] data, int datalen) 
        
        可是C部分调用是却出现空指针的调用异常。byte[]这个参数在C中该如何填入,传递到java部分?
       

解决方案 »

  1.   

    都没有人回答啊 ,对android版块很是失望啊
      

  2.   

    这个问题,一直没答案?期待android专区高手 
      

  3.   

    jbyteArray bytes = 0;
    int len = 20;
    bytes = (*env)->NewByteArray(env, len);
    if(bytes != NULL){
       (*env)->SetByteArrayRegion(env, bytes, 0, len, (jbyte *)szTemp);
       ....
    }楼主试试吧,我没有验证,希望对你有帮助
      

  4.   

    谢谢你,其实我也有试过这样的做法,问题是我c调用java的接口如果涉及到一些系统调用,比如读写文件或者操作内核数据时,就会出现异常。
    如C-->FunJava()
      FunJava()
       {
          //文件读写。
           //或者播放声音数据
       }
      

  5.   

    我现在做的另外一种替代方案是 使用socket的方式让它们进行通信。比如发 udp数据包。
      

  6.   

    如果你在FunJava中将传进来的数组拷贝一份,再做调用呢?有没有错误信息可以看一下。
    如果是c与java用socket方式通信的话,用本地socket就可以了吧
      

  7.   

    如果你在FunJava中将传进来的数组拷贝一份,再做调用呢?有没有错误信息可以看一下。
    如果是c与java用socket方式通信的话,用本地socket就可以了吧
      

  8.   


    ril就是这么干的,可以参考下
      

  9.   

    我是LZ,是这样的,so方面完成了aac数据流的解码,形成PCM数据流,然后想送到android应用层那边做播放,所以要将byte[]数据传输给应用层做播放,因此想调用java那边的接口,参数传入byte[]类型的数据,但是每次调用都会产生异常。 
      

  10.   

    根本原因是被C那边调用的FunJava里面包含了一些I/O操作,比如向缓冲区写入pcm数据等。或者读写文件。
      

  11.   

    看看android音频方面是怎么做的啊