java jni librtmp_librtmp 编译集成
RTMPDump
RTMPDump 是一個用來處理RTMP流媒體的開源工具包。它能夠單獨使用進行RTMP的通信,也可以集成到FFmpeg中通過FFmpeg接口來使用RTMPDump。
在Android中可以直接借助NDK在JNI層調用RTMPDump來完成RTMP通信。
在根目錄下提供了一個Makefile與一些.c源文件。這里的源文件將會編譯出一系列的可執行文件。然后我們需要的并不是可執行文件,真正的對RTMP的實現都在librtmp子目錄中。在這個子目錄中同樣包含了一個Makefile文件。通過閱讀Makefile發現,它的源碼并不多:OBJS=rtmp.o log.o amf.o hashswf.o parseurl.o。因此我們不進行預編譯,即直接放入AS中借助CMakeLists.txt來進行編譯。這么做可以讓我們方便的對庫本身進行調試或修改(實際上我們確實會稍微修改這個庫的源碼)。
在AS中復制librtmp置于:src/main/cpp/librtmp,并為其編寫CMakeLists.txt:
#所有源文件放入 rtmp_source 變量
file(GLOB rtmp_source *.c)
#編譯靜態庫
add_library(rtmp STATIC ${rtmp_source} )
在app/CMakeLists.txt中導入這個CMakeLists.txt:
cmake_minimum_required(VERSION 3.4.1)
#引入指定目錄下的CMakeLists.txt
add_subdirectory(librtmp)
#指定頭文件查找路徑
include_directories(librtmp)
add_library(native-lib SHARED native-lib.cpp)
target_link_libraries(native-lib rtmp log)
嘗試編譯:
xxx/app/src/main/cpp/librtmp/rtmp.c:40:10: fatal error: 'openssl/ssl.h' file not found
#include
^~~~~~~~~~~~~~~
1 error generated.
問題排查:
打開rtmp.c,我們發現有這里一段宏定義:
#ifdef CRYPTO
#ifdef USE_POLARSSL
#include
#elif defined(USE_GNUTLS)
#include
#else /* USE_OPENSSL */
#include
#include
#endif
TLS_CTX RTMP_TLS_ctx;
#endif
最終只有 CRYPTO 這個宏被定義了才會 #include 。那么我們繼續查找 CRYPTO 定義的地方,在 rtmp.h 中又有這樣一段:
#if !defined(NO_CRYPTO) && !defined(CRYPTO)
#define CRYPTO
#endif
我們只需要編譯時添加定義 NO_CRYPTO 這個預編譯宏就可以了。修改 librtmp中的CMakelists.txt:
cmake_minimum_required(VERSION 3.4.1)
#預編譯宏
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNO_CRYPTO")
#所有源文件放入 rtmp_source 變量
file(GLOB rtmp_source *.c)
#編譯靜態庫
add_library(rtmp STATIC ${rtmp_source})
輸出版本信息,編譯測試:
#include
#include
#include
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_pusher_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++";
char version[100];
sprintf(version, "rtmp version : %d", RTMP_LibVersion());
return env->NewStringUTF(version);
}
輸出 rtmp version: 131840,131840 對應的16進制為:0x020300,也就是2.3版本。
總結
以上是生活随笔為你收集整理的java jni librtmp_librtmp 编译集成的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 锐龙7000、13代酷睿发力 DDR5内
- 下一篇: 妈妈出差回不来爸爸穿旗袍送考 网友直呼: