2019-04-18 Mac OS交叉編譯mp4v2生成so文件

Apr 29, 2019 更新锯茄,添加深入學(xué)習(xí)鏈接:Mac上使用Android Studio封裝mp4v2庫的Java Native接口

下一篇:2019-04-25 Mac上使用Android Studio封裝mp4v2庫的Java Native接口(http://www.reibang.com/p/5d9ab4ee51d4)

1,環(huán)境及準(zhǔn)備

系統(tǒng):macOS Mojave version 10.14.4
NDK: android-ndk-r8d
Mp4v2版本:2.0.0
NDK各個(gè)版本鏈接:https://blog.csdn.net/shuzfan/article/details/52690554

android-ndk-r8d(December 2012)只有32位版本,r8e是第1個(gè)有64位版本的NDK
MacOS X 32-bit : http://dl.google.com/android/ndk/android-ndk-r8d-darwin-x86.tar.bz2(點(diǎn)擊直接下載)

2肌幽,步驟

1. 下載源碼

Mp4v2庫全部代碼晚碾,包含多個(gè)版本,可以使用SVN進(jìn)行同步下載喂急,這個(gè)不適合只是使用想要使用Mp4v2庫的普通開發(fā)開發(fā)者格嘁,官方推薦普通開發(fā)者直接下載Release版比較好,目前版本是2.0.0廊移,下文有介紹糕簿。
Mp4v2開源代碼地址(https://code.google.com/archive/p/mp4v2)

Mp4v2完整代碼(適合研究Mp4v2庫的)

普通開發(fā)者想要使用Mp4v2的話,推薦還是下載Release版就好了狡孔,我編譯的也是這個(gè)版本懂诗,Mp4v2 2.0.0<點(diǎn)擊下載>(https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/mp4v2/mp4v2-2.0.0.tar.bz2)

Mp4v2 2.0.0(推薦)

2. 目錄結(jié)構(gòu)調(diào)整

    1. 解壓下載好的壓縮文件 mp4v2-2.0.0.tar.bz2 得到項(xiàng)目 mp4v2-2.0.0
    1. 新建文件夾 jni 并把源碼移入苗膝,主要是 src殃恒、libplatformlibutil辱揭、mp4v2 文件夾离唐,其中 srclibplatformlibutil 直接從 mp4v2-2.0.0 目錄下拷貝问窃,mp4v2mp4v2-2.0.0 下的 include 中拷貝侯繁;
      目錄結(jié)構(gòu)
    1. libsobj 目錄分別對(duì)應(yīng)鏈接庫的輸出目錄和中間文件目錄
      · libs 輸出libMp4v2.so文件的目錄
      · obj 編譯過程產(chǎn)生的中間文件目錄,如圖
      obj編譯目錄

3. 創(chuàng)建文件Android.mk和Application.mk文件

這兩個(gè)文件放在 jni 目錄下
Android.mk文件內(nèi)容

LOCAL_PATH:=$(call my-dir)
 
include $(CLEAR_VARS)
NDK=/Users/Martin/Documents/AndroidDev/android-ndk-r8d
LOCAL_SRC_FILES:= \
    src/3gp.cpp src/atom_ac3.cpp \
    src/atom_amr.cpp src/atom_avc1.cpp src/atom_avcC.cpp \
    src/atom_chpl.cpp src/atom_colr.cpp src/atom_d263.cpp \
    src/atom_dac3.cpp src/atom_damr.cpp src/atom_dref.cpp \
    src/atom_elst.cpp src/atom_enca.cpp src/atom_encv.cpp \
    src/atom_free.cpp src/atom_ftyp.cpp src/atom_ftab.cpp \
    src/atom_gmin.cpp src/atom_hdlr.cpp src/atom_hinf.cpp \
    src/atom_hnti.cpp src/atom_href.cpp src/atom_mdat.cpp \
    src/atom_mdhd.cpp src/atom_meta.cpp src/atom_mp4s.cpp \
    src/atom_mp4v.cpp src/atom_mvhd.cpp src/atom_nmhd.cpp \
    src/atom_ohdr.cpp src/atom_pasp.cpp src/atom_root.cpp \
    src/atom_rtp.cpp src/atom_s263.cpp src/atom_sdp.cpp \
    src/atom_sdtp.cpp src/atom_smi.cpp src/atom_sound.cpp \
    src/atom_standard.cpp src/atom_stbl.cpp src/atom_stdp.cpp \
    src/atom_stsc.cpp src/atom_stsd.cpp src/atom_stsz.cpp \
    src/atom_stz2.cpp src/atom_text.cpp src/atom_tfhd.cpp \
    src/atom_tkhd.cpp src/atom_treftype.cpp src/atom_trun.cpp \
    src/atom_tx3g.cpp src/atom_udta.cpp src/atom_url.cpp \
    src/atom_urn.cpp src/atom_uuid.cpp src/atom_video.cpp \
    src/atom_vmhd.cpp src/atoms.h src/cmeta.cpp \
    src/descriptors.cpp src/descriptors.h src/exception.cpp \
    src/exception.h src/enum.h src/enum.tcc src/impl.h \
    src/isma.cpp src/log.h src/log.cpp src/mp4.cpp src/mp4array.h \
    src/mp4atom.cpp src/mp4atom.h src/mp4container.cpp \
    src/mp4container.h src/mp4descriptor.cpp src/mp4descriptor.h \
    src/mp4file.cpp src/mp4file.h src/mp4file_io.cpp \
    src/mp4info.cpp src/mp4property.cpp src/mp4property.h \
    src/mp4track.cpp src/mp4track.h src/mp4util.cpp src/mp4util.h \
    src/ocidescriptors.cpp src/ocidescriptors.h src/odcommands.cpp \
    src/odcommands.h src/qosqualifiers.cpp src/qosqualifiers.h \
    src/rtphint.cpp src/rtphint.h src/src.h src/text.cpp \
    src/text.h src/util.h src/bmff/bmff.h src/bmff/impl.h \
    src/bmff/typebmff.cpp src/bmff/typebmff.h \
    src/itmf/CoverArtBox.cpp src/itmf/CoverArtBox.h \
    src/itmf/Tags.cpp src/itmf/Tags.h src/itmf/generic.cpp \
    src/itmf/generic.h src/itmf/impl.h src/itmf/itmf.h \
    src/itmf/type.cpp src/itmf/type.h \
    src/qtff/ColorParameterBox.cpp src/qtff/ColorParameterBox.h \
    src/qtff/PictureAspectRatioBox.cpp \
    src/qtff/PictureAspectRatioBox.h src/qtff/coding.cpp \
    src/qtff/coding.h src/qtff/impl.h src/qtff/qtff.h \
    libplatform/endian.h libplatform/impl.h \
    libplatform/io/File.cpp libplatform/io/File.h \
    libplatform/io/FileSystem.cpp libplatform/io/FileSystem.h \
    libplatform/number/random.h libplatform/platform.h \
    libplatform/platform_base.h libplatform/platform_posix.h \
    libplatform/process/process.h \
    libplatform/prog/option.cpp libplatform/prog/option.h \
    libplatform/sys/error.cpp libplatform/sys/error.h \
    libplatform/time/time.cpp libplatform/time/time.h \
    libplatform/warning.h libplatform/io/File_posix.cpp \
    libplatform/io/FileSystem_posix.cpp \
    libplatform/number/random_posix.cpp \
    libplatform/process/process_posix.cpp \
    libplatform/time/time_posix.cpp \
    libutil/Database.cpp \
    libutil/Database.h libutil/Timecode.cpp libutil/Timecode.h \
    libutil/TrackModifier.cpp libutil/TrackModifier.h \
    libutil/Utility.cpp libutil/Utility.h libutil/crc.cpp \
    libutil/crc.h libutil/impl.h libutil/other.cpp libutil/other.h \
    libutil/util.h
 
LOCAL_ARM_MODE := arm
LOCAL_CFLAGS := -fexceptions
 
LOCAL_LDFLAGS := \
        $(NDK)/sources/cxx-stl/gnu-libstdc++/4.4.3/libs/armeabi-v7a/libsupc++.a
 
LOCAL_LDLIBS := -llog
 
LOCAL_SHARED_LIBRARIES := \
    libutils \
    libbinder \
    libcutils
LOCAL_CXXFLAGS :=-fexceptions -Wno-write-strings
 
LOCAL_MODULE:= libMp4v2
LOCAL_CPPFLAGS := -O2 -fexceptions -DHAVE_SOCKLEN_T -DHAVE_STRUCT_IOVEC
LOCAL_MODULE_TAGS := optional
include $(BUILD_SHARED_LIBRARY)

Application.mk文件

APP_ABI := armeabi
APP_PLATFORM := android-8
APP_STL := stlport_static
APP_CPPFLAGS += -fno-rtti

4.編譯

    1. cdjni 目錄
    1. 調(diào)用NDK工具ndk-build進(jìn)行編譯

因?yàn)槲疫@邊下載了多個(gè)版本的NDK泡躯,環(huán)境變量指定NDK版本是18贮竟,不適合在這里進(jìn)行編譯,所以我這邊使用了 $ /Users/Martin/Documents/AndroidDev/android-ndk-r8d/ndk-build 命令较剃,指定了對(duì)應(yīng)的NDK進(jìn)行編譯咕别,開發(fā)者如果不使用同樣的NDK版本,則需要修改Android.mk文件中的變量NDK=/Users/Martin/Documents/AndroidDev/android-ndk-r8d写穴,指定對(duì)應(yīng)NDK惰拱,同時(shí)也要修改LOCAL_LDFLAGS := \ $(NDK)/sources/cxx-stl/gnu-libstdc++/4.4.3/libs/armeabi-v7a/libsupc++.a到NDK中對(duì)應(yīng)的.a文件路徑,如圖:

Android.mk中的NDK變量

Android.mk中的LOCAL_LDFLAGS

如果做相應(yīng)修改啊送,則可能會(huì)遇到編譯問題偿短,下文有介紹。

3馋没,結(jié)果

Terminal終端輸出結(jié)果:

MartinMac:jni Martin$ /Users/Martin/Documents/AndroidDev/android-ndk-r8d/ndk-build 
Android NDK: WARNING: Unsupported source file extensions in /Users/Martin/GitHub/Mp4v2/mp4v2-2.0.0/jni/Android.mk for module Mp4v2    
Android NDK:   src/atoms.h src/descriptors.h src/exception.h src/enum.h src/enum.tcc src/impl.h src/log.h src/mp4array.h src/mp4atom.h src/mp4container.h src/mp4descriptor.h src/mp4file.h src/mp4property.h src/mp4track.h src/mp4util.h src/ocidescriptors.h src/odcommands.h src/qosqualifiers.h src/rtphint.h src/src.h src/text.h src/util.h src/bmff/bmff.h src/bmff/impl.h src/bmff/typebmff.h src/itmf/CoverArtBox.h src/itmf/Tags.h src/itmf/generic.h src/itmf/impl.h src/itmf/itmf.h src/itmf/type.h src/qtff/ColorParameterBox.h src/qtff/PictureAspectRatioBox.h src/qtff/coding.h src/qtff/impl.h src/qtff/qtff.h libplatform/endian.h libplatform/impl.h libplatform/io/File.h libplatform/io/FileSystem.h libplatform/number/random.h libplatform/platform.h libplatform/platform_base.h libplatform/platform_posix.h libplatform/process/process.h libplatform/prog/option.h libplatform/sys/error.h libplatform/time/time.h libplatform/warning.h libutil/Database.h libutil/Timecode.h libutil/TrackModifier.h libutil/Utility.h libutil/crc.h libutil/impl.h libutil/other.h libutil/util.h    
Compile++ arm    : Mp4v2 <= 3gp.cpp
Compile++ arm    : Mp4v2 <= atom_ac3.cpp
Compile++ arm    : Mp4v2 <= atom_amr.cpp
Compile++ arm    : Mp4v2 <= atom_avc1.cpp
Compile++ arm    : Mp4v2 <= atom_avcC.cpp
Compile++ arm    : Mp4v2 <= atom_chpl.cpp
Compile++ arm    : Mp4v2 <= atom_colr.cpp
Compile++ arm    : Mp4v2 <= atom_d263.cpp
Compile++ arm    : Mp4v2 <= atom_dac3.cpp
Compile++ arm    : Mp4v2 <= atom_damr.cpp
Compile++ arm    : Mp4v2 <= atom_dref.cpp
Compile++ arm    : Mp4v2 <= atom_elst.cpp
Compile++ arm    : Mp4v2 <= atom_enca.cpp
Compile++ arm    : Mp4v2 <= atom_encv.cpp
Compile++ arm    : Mp4v2 <= atom_free.cpp
Compile++ arm    : Mp4v2 <= atom_ftyp.cpp
Compile++ arm    : Mp4v2 <= atom_ftab.cpp
Compile++ arm    : Mp4v2 <= atom_gmin.cpp
Compile++ arm    : Mp4v2 <= atom_hdlr.cpp
Compile++ arm    : Mp4v2 <= atom_hinf.cpp
Compile++ arm    : Mp4v2 <= atom_hnti.cpp
Compile++ arm    : Mp4v2 <= atom_href.cpp
Compile++ arm    : Mp4v2 <= atom_mdat.cpp
Compile++ arm    : Mp4v2 <= atom_mdhd.cpp
Compile++ arm    : Mp4v2 <= atom_meta.cpp
Compile++ arm    : Mp4v2 <= atom_mp4s.cpp
Compile++ arm    : Mp4v2 <= atom_mp4v.cpp
Compile++ arm    : Mp4v2 <= atom_mvhd.cpp
Compile++ arm    : Mp4v2 <= atom_nmhd.cpp
Compile++ arm    : Mp4v2 <= atom_ohdr.cpp
Compile++ arm    : Mp4v2 <= atom_pasp.cpp
Compile++ arm    : Mp4v2 <= atom_root.cpp
Compile++ arm    : Mp4v2 <= atom_rtp.cpp
Compile++ arm    : Mp4v2 <= atom_s263.cpp
Compile++ arm    : Mp4v2 <= atom_sdp.cpp
Compile++ arm    : Mp4v2 <= atom_sdtp.cpp
Compile++ arm    : Mp4v2 <= atom_smi.cpp
Compile++ arm    : Mp4v2 <= atom_sound.cpp
Compile++ arm    : Mp4v2 <= atom_standard.cpp
Compile++ arm    : Mp4v2 <= atom_stbl.cpp
Compile++ arm    : Mp4v2 <= atom_stdp.cpp
Compile++ arm    : Mp4v2 <= atom_stsc.cpp
Compile++ arm    : Mp4v2 <= atom_stsd.cpp
Compile++ arm    : Mp4v2 <= atom_stsz.cpp
Compile++ arm    : Mp4v2 <= atom_stz2.cpp
Compile++ arm    : Mp4v2 <= atom_text.cpp
Compile++ arm    : Mp4v2 <= atom_tfhd.cpp
Compile++ arm    : Mp4v2 <= atom_tkhd.cpp
Compile++ arm    : Mp4v2 <= atom_treftype.cpp
Compile++ arm    : Mp4v2 <= atom_trun.cpp
Compile++ arm    : Mp4v2 <= atom_tx3g.cpp
Compile++ arm    : Mp4v2 <= atom_udta.cpp
Compile++ arm    : Mp4v2 <= atom_url.cpp
Compile++ arm    : Mp4v2 <= atom_urn.cpp
Compile++ arm    : Mp4v2 <= atom_uuid.cpp
Compile++ arm    : Mp4v2 <= atom_video.cpp
Compile++ arm    : Mp4v2 <= atom_vmhd.cpp
Compile++ arm    : Mp4v2 <= cmeta.cpp
Compile++ arm    : Mp4v2 <= descriptors.cpp
Compile++ arm    : Mp4v2 <= exception.cpp
Compile++ arm    : Mp4v2 <= isma.cpp
Compile++ arm    : Mp4v2 <= log.cpp
Compile++ arm    : Mp4v2 <= mp4.cpp
Compile++ arm    : Mp4v2 <= mp4atom.cpp
Compile++ arm    : Mp4v2 <= mp4container.cpp
Compile++ arm    : Mp4v2 <= mp4descriptor.cpp
Compile++ arm    : Mp4v2 <= mp4file.cpp
Compile++ arm    : Mp4v2 <= mp4file_io.cpp
Compile++ arm    : Mp4v2 <= mp4info.cpp
Compile++ arm    : Mp4v2 <= mp4property.cpp
Compile++ arm    : Mp4v2 <= mp4track.cpp
Compile++ arm    : Mp4v2 <= mp4util.cpp
Compile++ arm    : Mp4v2 <= ocidescriptors.cpp
Compile++ arm    : Mp4v2 <= odcommands.cpp
Compile++ arm    : Mp4v2 <= qosqualifiers.cpp
Compile++ arm    : Mp4v2 <= rtphint.cpp
Compile++ arm    : Mp4v2 <= text.cpp
Compile++ arm    : Mp4v2 <= typebmff.cpp
Compile++ arm    : Mp4v2 <= CoverArtBox.cpp
Compile++ arm    : Mp4v2 <= Tags.cpp
Compile++ arm    : Mp4v2 <= generic.cpp
Compile++ arm    : Mp4v2 <= type.cpp
Compile++ arm    : Mp4v2 <= ColorParameterBox.cpp
Compile++ arm    : Mp4v2 <= PictureAspectRatioBox.cpp
Compile++ arm    : Mp4v2 <= coding.cpp
Compile++ arm    : Mp4v2 <= File.cpp
Compile++ arm    : Mp4v2 <= FileSystem.cpp
Compile++ arm    : Mp4v2 <= option.cpp
Compile++ arm    : Mp4v2 <= error.cpp
Compile++ arm    : Mp4v2 <= time.cpp
Compile++ arm    : Mp4v2 <= File_posix.cpp
Compile++ arm    : Mp4v2 <= FileSystem_posix.cpp
Compile++ arm    : Mp4v2 <= random_posix.cpp
Compile++ arm    : Mp4v2 <= process_posix.cpp
Compile++ arm    : Mp4v2 <= time_posix.cpp
Compile++ arm    : Mp4v2 <= Database.cpp
Compile++ arm    : Mp4v2 <= Timecode.cpp
Compile++ arm    : Mp4v2 <= TrackModifier.cpp
Compile++ arm    : Mp4v2 <= Utility.cpp
Compile++ arm    : Mp4v2 <= crc.cpp
Compile++ arm    : Mp4v2 <= other.cpp
Prebuilt       : libstlport_static.a <= <NDK>/sources/cxx-stl/stlport/libs/armeabi/
SharedLibrary  : libMp4v2.so
Install        : libMp4v2.so => libs/armeabi/libMp4v2.so
MartinMac:jni Martin$ 

項(xiàng)目文件夾:


輸出so文件目錄

4昔逗,問題

NDK版本過高可能引起的問題:
問題1:armeabi不支持,R16后篷朵,拋棄了armeabi

問題2:APP_STL stlport_static is no longer supported

問題3:Android.mk中指定了NDK為android-ndk-r8d勾怒,如不使用婆排,切記要替換


問題
arm-linux-androideabi-g++: error: /opt/android-ndk-r8d/sources/cxx-stl/gnu-libstdc++/4.4.3/libs/armeabi-v7a/libsupc++.a: No such file or directory

問題4:# WARNING: …/Android.mk: non-system libraries in linker flags(https://stackoverflow.com/questions/25663989/warning-android-mk-non-system-libraries-in-linker-flags)

5,參考文章鏈接

Linux系統(tǒng)下編譯mp4v2生成Android下使用的So文件
android 編譯mp4v2 2.0.0生成動(dòng)態(tài)庫

Mac環(huán)境下配置NDK環(huán)境

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末笔链,一起剝皮案震驚了整個(gè)濱河市段只,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鉴扫,老刑警劉巖赞枕,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異坪创,居然都是意外死亡鹦赎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門误堡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來古话,“玉大人,你說我怎么就攤上這事锁施∨悴龋” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵悉抵,是天一觀的道長(zhǎng)肩狂。 經(jīng)常有香客問我,道長(zhǎng)姥饰,這世上最難降的妖魔是什么傻谁? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮列粪,結(jié)果婚禮上审磁,老公的妹妹穿的比我還像新娘。我一直安慰自己岂座,他們只是感情好态蒂,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著费什,像睡著了一般钾恢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鸳址,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天瘩蚪,我揣著相機(jī)與錄音,去河邊找鬼稿黍。 笑死疹瘦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的闻察。 我是一名探鬼主播拱礁,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼辕漂!你這毒婦竟也來了呢灶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤钉嘹,失蹤者是張志新(化名)和其女友劉穎鸯乃,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體跋涣,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缨睡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了陈辱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奖年。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖沛贪,靈堂內(nèi)的尸體忽然破棺而出陋守,到底是詐尸還是另有隱情,我是刑警寧澤利赋,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布水评,位于F島的核電站,受9級(jí)特大地震影響媚送,放射性物質(zhì)發(fā)生泄漏中燥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一塘偎、第九天 我趴在偏房一處隱蔽的房頂上張望疗涉。 院中可真熱鬧,春花似錦吟秩、人聲如沸博敬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽偏窝。三九已至,卻和暖如春武学,著一層夾襖步出監(jiān)牢的瞬間祭往,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工火窒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留硼补,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓熏矿,卻偏偏與公主長(zhǎng)得像已骇,于是被迫代替她去往敵國(guó)和親离钝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容