一、首先解决自己问题: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
网友评论