日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java jni librtmp_librtmp 编译集成

發布時間:2023/12/10 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 编译集成的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。