音视频编解码相关知识
既然音视频一定会用到c/c++库,所以也就会使用jni
开发工具
- AndroidSudio3.1.1
- SDK Tool(CMake、LLDB、NDK)
操作步骤
- 1.创建一个新项目
- 2.在新项目中创建一个native方法的类
public class JniHelper {
public static native String getStringTemp();
}
- 3.将2中的java文件生产.h文件,同时创建一个新的cpp文件,main/cpp/xxx.h和main/cpp/xxx.cpp
其中main/cpp/xxx.h自动生成
JNIEXPORT jstring JNICALL Java_com_hbs_androidjnitest_JniHelper_getStringTemp
(JNIEnv *, jclass);
其中main/cpp/xxx.cpp自己创建的
#include <iostream>
#include <sstream>
#include "com_hbs_androidjnitest_JniHelper.h"
JNIEXPORT jstring JNICALL Java_com_hbs_androidjnitest_JniHelper_getStringTemp(JNIEnv *env, jclass instance){
std::stringstream ss;
ss << "Hello from c++ " << std::endl;
return env->NewStringUTF(ss.str().c_str());
}
- 4.在app目录下创建一个CMakeLists.txt
# cmake version
cmake_minimum_required(VERSION 3.4.1)
# 支持 -std=gnu++11
set(CMAKE_VERBOSE_MAKEFILE on)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
# CMAKE_SOURCE_DIR 是 CMakeLists.txt 所在的目录
add_library( my-lib SHARED ${CMAKE_SOURCE_DIR}/src/main/cpp/native-lib.cpp )
find_library( log-lib log )
target_link_libraries( my-lib ${log-lib} )
- 5.修改app目录下的build.gradle
defaultConfig 中添加
// code block added by myself
externalNativeBuild {
cmake {
// 指定编译器参数
cppFlags "-std=c++11 -frtti -fexceptions"
// 生成.so库的目标平台
abiFilters 'armeabi', 'armeabi-v7a', 'x86'
}
}
android中添加
// code block added by myself
// 指定 CMakeLists.txt 相对此 build.gradle 文件的路径
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
6.生产.so文件
点击:View–Tool Windows–Gradle看编辑器右侧:app–Tasks–build–build
生成目录:build\intermediates\cmake\debug\obj7.使用生产.so文件
将生成的.so文件复制到src/main/jniLib文件夹下
修改1中创建的java文件
public class JniHelper {
static {
System.loadLibrary("my-lib");
}
public static native String getStringTemp();
}
函数调用此方法
JniHelper.getStringTemp()