arm64-v8a
ANDROID_ABI=arm64-v8a
ANDROID_API=android-21
ANDROID_ARCH=arch-arm64
ANDROID_EABI=aarch64-linux-android-4.9
HOST=aarch64-linux-android
CROSS_COMPILE=aarch64-linux-android-
build_x264
上述为在Linux上的脚本,需要注意
- ANDROID_NDK 需要替换成你自己的android ndk路径。这里使用的是ndk-14b版本
- 如果是MacOS需要将
TOOLCHAIN
后路径替换成$ANDROID_NDK/toolchains/$ANDROID_EABI/prebuilt/darwin-x86_64/bin
脚本编辑完成之后保存,然后在Terminal
赋予可执行权限并编译:
cd xxx/x264 // 进入x264目录
sudo chmod +x build_x264.sh // 赋予可执行权限
./build_x264.sh //开始交叉编译
编译之后会在当前目录生成一个android
文件夹,打开之后就会看到大概如下内容: 任意打开一个文件夹,我们可以看到如下内容:
include
里面装的是头文件 - 后面会用到bin
里面装的是x264执行文件 - 终端使用,不用考虑lib
里面装的就是我们需要的.a和.so二进制文件 - 最终就是为了它
使用
虽然我们已经成功编译出了libx264的二进制文件,但是在Android上还是不能直接使用。因为还没有写编码程序。
在Android上使用大概有如下两种方式:
- 通过
cmake
的方式直接在Android Studio上使用 ndk-build
编译成可直接使用的动态链接文件。
下面会详细介绍这两种方式的使用方法。
Cmake
-
创建一个Android的原生项目(Native)。怎么创建?请参考《Android音视频开发:音频非压缩编码和压缩编码》,里面介绍了如何创建一个Native项目。
-
创建完成项目之后,将上述提到的
include
文件夹里面的头文件放入cpp
这个文件夹下
请先忽略这个
h264-encode
的这个c++文件,在后面会介绍
-
然后在
main
目录下创建nativeLibs
文件夹,将arm64-v8a
和armeabi-v7a
的两个文件夹的内容拷贝进去,如上图那样。 -
创建
h264-encode.cpp
的编码视频的处理程序。粘贴代码如下:
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include “android/log.h”
extern “C” {
#include “x264.h”
#include “jni.h”
}
#define LOGD(…) __android_log_print(ANDROID_LOG_DEBUG , “h264-encode”, VA_ARGS)
#define LOGI(…) __android_log_print(ANDROID_LOG_INFO , “h264-encode”, VA_ARGS)
#define LOGE(…) __android_log_print(ANDROID_LOG_ERROR , “h264-encode”, VA_ARGS)
extern “C”
JNIEXPORT jint JNICALL
Java_com_coder_x264cmake_X264Encode_encode(
JNIEnv *env, jobject thiz,
jint width, jint height,
jstring yuv_path, jstring h264_path, jint yuv_csp) {
int ret = 0;
// TODO: implement encode()
if (width == 0 || height == 0) {
LOGE(“width or height cannot be zero!”);
}
const char *yuv_file_path = env->GetStringUTFChar