美文网首页
webrtc关于Android端代码之-jni-接口导出及回调使

webrtc关于Android端代码之-jni-接口导出及回调使

作者: 大飞_2048 | 来源:发表于2019-08-22 21:03 被阅读0次

    一、首先解决自己问题:Android我需要 导出一段音频数据

    jni问题细化: 因为c传回的值是BYTE*,而返回给java代码是byte[],对应的jni的数据必须是jbyteArray,

      所以需要转换:


    jbyte *pData = (jbyte*)audio_data;

    jbyteArray jarray = env->NewByteArray();

    int nLenSize = number_of_frames *number_of_channels *2;

    env->SetByteArrayRegin(jarray,0, nLenSize, pData);

    参考blog:https://blog.csdn.net/bzlj2912009596/article/details/78859501

    但是webrtc不是这么玩耍的。需要在外面包装一层,我是看了很多代码没有搜索到。需要手动添加:

    jbyte *pData = (jbyte*)audio_data;

    jbyteArray jarray = env->NewByteArray();

    int nOutSize = number_of_frames *number_of_channels *2;

    ScopedJavaLocalRef jni_buffer(jni, jni->NewByteArray(nOutSize)); //webrtc需要用这个类型的。

    jni->SetByteArrayRegion(

    jni_buffer.obj(),0, nOutSize, pData);

    Java_AudioRenderSink_onData(jni,j_sink_,jni_buffer,bits_per_sample,sample_rate,number_of_channels);

    二、java基础

    (1)@Override  添加很有意义,编译器可以给你验证@Override下面的方法名是否是你父类中所有的

    (2)aar 引用,这个问题流程熟悉

    repositories {

    flatDir {

    dirs'libs'

        }

    }

    implementation(name:'libwebrtc',ext:'aar')

    https://blog.csdn.net/liuxiIT/article/details/7827626

    三,记录下webrtc关于gni的使用

      1、   用一个例子说明吧。VideoTrack.java是如何使用调用C函数呢。

    (1)这个需要从BUILD.gn说起

    BUILD.gn文件添加jni文件支持

    (2).java层:添加接口

    AudioTrack.java 文件添加

      private static native void nativeSetVolume(long track, double volume);

      private static native void nativeAddSink(long track,long renderSink);

      private static native void nativeRemoveSink(long track,long renderSink);

      private static native long nativeWrapSink(AudioRenderSink sink);

      private static native void nativeFreeSink(long sink);

    (3)jni的针对java的头文件及接口文件生成

               < 3.1>头文件:  src\base\android\jni_generator\jni_generator.py      

            这个python文件会对AudioTrack.java文件,生产jni头文件  AudioTrack_jni.h 

               目录地址: "sdk/android/generated_peerconnection_jni/AudioTrack_jni.h"

               生成规则:“java_name” + _jni.h

              <3.2>接口: 包名_类型_函数(去掉native前缀)名拼接规则

             具体method名字:nativeSetVolume生成规则:

          nativeSetVolume ===>JNI_ + "class_name" + "Method_name()"     //method匹配的方法去掉了native前缀的 

            例如AudioTrack.java生成的jni文件 AudioTrack_jni.h文件

    2、c调用java文件

    @CalledByNative  这个宏定义会生成供给c调用的函数文件,映射。

        将java层的文件透给C文件使用

    参考:记录下详细介绍jni基础知识的blog

          https://www.jianshu.com/p/87ce6f565d37

    相关文章

      网友评论

          本文标题:webrtc关于Android端代码之-jni-接口导出及回调使

          本文链接:https://www.haomeiwen.com/subject/ytnosctx.html