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

一、首先解决自己问题: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-接口导出及回调使用)