Android NDK 開發(fā)(五)AndroidStudio 2.2 NDK的開發(fā)環(huán)境搭建

前言

之前一直在用Eclipse 做開發(fā),直到今年年初才將項目遷移到Google 推薦的AndroidStudio上面蒙谓,畢竟這是一個趨勢柜候,可誰知道事情根本沒有我想的那么簡單,這期間遇到了N多坑汽摹,我想這些坑可能大家也有可能遇到,不在這里詳細(xì)敘述苦锨。最終一個個問題的去解決逼泣,走完了這些坑趴泌,覺得還挺好用的,Eclipse 是一個吃內(nèi)存的IDE拉庶,反正我每次打開嗜憔,編寫代碼的時候就會卡,有時候還是死掉氏仗,已無力吐糟~~吉捶,AndroidStudio的界面更人性化,除此之外皆尔,還有更多的功能呐舔。所以決定把之前在正在eclipse上開發(fā)的一個使用NDK開發(fā)的android項目轉(zhuǎn)移到AndroidStudio上,在2.2之前對C/C++ 支持不是很友好床佳,沒有語法提示滋早,編譯也不方便等問題,所以期待了的Android Studio 2.2 版本穩(wěn)定版終于在前段發(fā)布砌们,一直未來得及嘗試杆麸,今天把整個過程記下來,希望能給你有所幫助浪感。

原文鏈接請標(biāo)明:

轉(zhuǎn)載:http://blog.csdn.net/u011974987/article/details/52888864

參考文獻(xiàn):https://developer.android.com/studio/projects/add-native-code.html#create-sources

正文

1. 下載開發(fā)工具和NDK(windows10 64位環(huán)境)

Android Studio 2.2 的NDK開發(fā)支持 CMake和ndk-build兩種方式昔头,默認(rèn)的是CMake編譯的,編譯和調(diào)試需要下載安裝以下組件:

AndroidStudio官網(wǎng)下載地址:

Android Studio 2.2(需要梯子)

推薦一個國內(nèi)的鏡像網(wǎng)站:

http://www.androiddevtools.cn(身為開發(fā)者都應(yīng)該知道影兽,O(∩_∩)O)

下載最新版的Android Studio 2.2:

Download (點擊下載)

下載NDK:android-ndk-r12b-windows-x86_64

CMake:Android Studio 默認(rèn)使用 CMake 編譯原生庫揭斧,如果你只打算用ndk-build來編譯的話,你就不需要這個組件峻堰。

LLDB:使用它來調(diào)試本地代碼讹开。

注意:要在 Android Studio 中使用 CMake 或者 ndk-build,你需要使用 Android Studio 2.2 或更高的版本捐名,同時需要配合使用 Android Plugin for Gradle 2.2.0 及以上的版本旦万。

你可以使用 SDK Manager 來安裝上述組件:

已安裝的軟件包如有更新,其旁邊的復(fù)選框中會顯示短劃線

打開一個項目镶蹋,從菜單欄中選擇Tools > Android > SDK Manager成艘。

點擊SDK Tools選項卡。

勾選LLDB贺归,CMake和NDK淆两。如圖一:


點擊 Apply ,然后點擊 OK 拂酣。

當(dāng)安裝完成后秋冰,點擊 Finish ,然后點擊 OK 婶熬。

創(chuàng)建支持Native Code新項目

創(chuàng)建一個支持 native code 的項目和創(chuàng)建普通的 Android studio 工程很像丹莲。但是有幾點需要留意的地方:

在 Configure your new project 選項中光坝,勾選 Include C++ Support 選項铝耻。

點擊 Next糠惫,后面的流程和創(chuàng)建普通的 Android studio 工程一樣常挚。

在 Customize C++ Support 選項卡中。你有下面幾種方式來自定義你的項目:

C++ Standard :點擊下拉框洲赵,可以選擇標(biāo)準(zhǔn) C++,或者選擇默認(rèn) CMake 設(shè)置的 Toolchain Default 選項商蕴。

Exceptions Support :如果你想使用有關(guān) C++ 異常處理的支持叠萍,就勾選它。勾選之后绪商,Android Studio 會在 module 層的 build.gradle 文件中的 cppFlags 中添加 -fexcetions 標(biāo)志苛谷。

Runtime Type Information Support :如果你想支持 RTTI,那么就勾選它格郁。勾選之后腹殿,Android Studio 會在 module 層的 build.gradle 文件中的 cppFlags 中添加 -frtti 標(biāo)志。

點擊 “Finish”例书。

當(dāng) Android Studio 完成新項目創(chuàng)建后锣尉,打開 Project 面板,選擇 Android 視圖决采。Android Studio 會添加 cpp 和 External Build Files 文件夾自沧。


cpp文件夾存放你所有 native code 的地方,包括源碼树瞭,頭文件拇厢,預(yù)編譯項目等。對于新項目晒喷,Android Studio 創(chuàng)建了一個 C++ 模板文件:native-lib.cpp孝偎,并且將該文件放到了你的 app 模塊的src/main/cpp/目錄下。這份模板代碼提供了一個簡答的 C++ 函數(shù):stringFromJNI()厨埋,該函數(shù)返回一個字符串:”Hello from C++”邪媳。

External Build Files文件夾是存放CMake或ndk-build構(gòu)建腳本的地方。有點類似于 build.gradle 文件告訴 Gradle 如何編譯你的 APP 一樣荡陷,CMake 和 ndk-build 也需要一個腳本來告知如何編譯你的 native library雨效。對于一個新的項目,Android Studio 創(chuàng)建了一個 CMake 腳本:CMakeLists.txt废赞,并且將其放到了你的 module 的根目錄下徽龟。

編譯運(yùn)行示例 APP

當(dāng)你點擊 Run 按鈕,Android Studio 會編譯并啟動一個 APP 唉地,然后在 APP 中顯示一段文字”Hello from C++”据悔。


從編譯到運(yùn)行示例 APP 的流程簡單歸納如下:

Gradle 調(diào)用外部構(gòu)建腳本传透,也就是 CMakeLists.txt 。

CMake 會根據(jù)構(gòu)建腳本的指令去編譯一個 C++ 源文件极颓,也就是 native-lib.cpp 朱盐,并將編譯后的產(chǎn)物扔進(jìn)共享對象庫中,并將其命名為 libnative-lib.so 菠隆,然后 Gradle 將其打包到 APK 中兵琳。

在運(yùn)行期間,APP 的 MainActivity 會調(diào)用 System.loadLibrary() 方法骇径,加載 native library躯肌。而這個庫的原生函數(shù), stringFromJNI() 破衔,就可以為 APP 所用了清女。

MainActivity.onCreate() 方法會調(diào)用 stringFromJNI() ,然后返回 “Hello from C++”晰筛,并更新 TextView 的顯示嫡丙。

注意: Instant Run 并不兼容使用了 native code 的項目。Android Studio 會自動禁止 Instant

Run 功能传惠。

如果你想驗證一下 Gradle 是否將 native library 在APK中是否存在迄沫,你可以使用APK Analyzer:

1. 選擇 Build > Analyze APK 。

2. 從 app/build/outputs/apk/ 路徑中選擇 APK卦方,并點擊 OK 羊瘩。

3. 如下圖,在 APK Analyzer 窗口中盼砍,選擇 lib// 尘吗,你就可以看見 libnative-lib.so 。


將 C/C++ 代碼添加到現(xiàn)有的項目中

如果你想將 native code 添加到一個現(xiàn)有的項目中浇坐,請按照下面的步驟:

創(chuàng)建新的 native source 文件睬捶,并將其添加到你的 Android Studio 項目中。如果你已經(jīng)有了 native code近刘,也可以跳過這一步擒贸。

創(chuàng)建一個 CMake 構(gòu)建腳本。如果你已經(jīng)有了一個 CMakeLists.txt 構(gòu)建腳本觉渴,或者你想使用 ndk-build 然后有一個 Android.mk 構(gòu)建腳本介劫,也可以跳過這一步。

將你的 native library 與 Gradle 關(guān)聯(lián)起來案淋。Gradle 使用構(gòu)建腳本將源碼導(dǎo)入到你的 Android Studio 項目中座韵,并且將你的 native library (也就是 .so 文件)打包到 APK 中。

一旦你配置好了你的項目,你就可以在 Java 代碼中誉碴,使用 JNI 框架開調(diào)用原生函數(shù)(native functions)宦棺。只需要點擊 Run 按鈕,就可以編譯運(yùn)行你的 APP 了黔帕。

創(chuàng)建新的 native source 文件

請按照下面的方法來創(chuàng)建一個 cpp/ 文件夾和源文件(native source files):

打開IDE左邊的 Project 面板代咸,選擇 Project 視圖。

找到你項目的 module > src 目錄成黄,右鍵點擊 main 文件夾侣背,選擇 New > Directory 。

輸入文件夾的名字(比如 cpp)慨默,然后點擊 OK 。

右鍵點擊剛才創(chuàng)建好的文件夾弧腥,選擇 New > C/C++ Source File 厦取。

輸入文件名,比如 native-lib 管搪。

在 Type 菜單下拉選項中虾攻,選擇源文件的擴(kuò)展后綴名,比如 .cpp 更鲁。

如果你也想創(chuàng)建一個頭文件霎箍,點擊 Create an associated header 選項框。

點擊 OK 澡为。

創(chuàng)建 CMake 構(gòu)建腳本

如果沒有一個 CMake 構(gòu)建腳本漂坏,你需要自己手動創(chuàng)建一個,并添加一些合適的 CMake 命令媒至。CMake 構(gòu)建腳本是一個空白的文本文檔(后綴為 .txt 的文件)顶别,名字必須為 CMakeLists.txt 。

注意:如果你的項目使用了 ndk-build拒啰,你就不需要創(chuàng)建 CMake 構(gòu)建腳本驯绎,只需要提供一個路徑鏈,將你的 Android.mk

文件鏈接到 Gradle 中即可谋旦。

將一個空白的文本文檔變成一個 CMake 構(gòu)建腳本剩失,你需要這么做:

打開 IDE 左邊的 Project 面板,選擇 Project 視圖册着。

在你的 module 根目錄下拴孤,右鍵,選擇 New > File 指蚜。

輸入 “CMakeLists.txt” 作為文件名乞巧,并點擊 OK 。

現(xiàn)在摊鸡,你可以添加 CMake 命令來配置你的構(gòu)建腳本了绽媒。為了讓 CMake 將源代碼(native source code)編譯成 native library蚕冬。需要在編譯文件中添加cmake_minimum_required()和add_library()命令:

# 設(shè)置建立你的本地庫所需的CMake的最低版本。# 這為了確保某些功能在你構(gòu)建的時候是可用的是辕。cmake_minimum_required(VERSION3.4.1)# 指定庫名# 并提供源代碼的相對路徑.# 你可以通過add.library()命令定義多個庫,CMake會去構(gòu)建他們囤热,# 當(dāng)你構(gòu)建App 的時候,Gradle 會自動把庫打包到你的apk 中add_library( # Specifies the name of the library.

native-lib

# Sets the library as a shared library.

SHARED

# Provides a relative path to your source file(s).

src/main/cpp/native-lib.cpp )

當(dāng)你使用add_library()获三,將一個源文件(source file)或庫添加到你的 CMake 構(gòu)建腳本旁蔼,同步你的項目,然后你會發(fā)現(xiàn) Android studio 將關(guān)聯(lián)的頭文件也顯示了處理疙教。然而棺聊,為了讓 CMake 在編譯時期能定位到你的頭文件,你需要在 CMake 構(gòu)建腳本中添加include_directories()命令贞谓,并指定頭文件路徑:

add_library(...)# Specifies a path to native header files.include_directories(src/main/cpp/include/)

CMake的使用命名庫的文件的約定下面的形式:

lib*library-name*.so

例如 限佩,如果你在構(gòu)建腳本中,將 library 命名為 “native-lib”裸弦,那么 CMake 會創(chuàng)建叫 libnative-lib.so 的文件祟同。但是,當(dāng)你將 library 加載到 Java 代碼中的時候理疙, 你需要使用在 CMake 中指定的名稱:

static{

????System.loadLibrary(“native-lib”);

}

注意:如果你將 CMake 腳本里面的 library 重命名了晕城,或者移除了。你需要清理一下你的工程窖贤。在 IDE 的菜單欄中選擇 Build > Clean Project 砖顷。

Android Studio 會在 Project 面板中的 cpp 文件夾中自動添加源文件和頭文件。你可以多次使用 add_library() 命令主之,來添加額外的 library择吊。

添加 NDK APIs

Android NDK 提供了一些有用的 native APIs。將 NDK librarys 添加到 CMakeLists.txt 腳本文件中槽奕,就可以使用這些 API 了几睛。

預(yù)編譯的 NDK librarys 已經(jīng)存在在 Android 平臺中了,所以你不需要編譯它們粤攒,或者是將其打包到你的 APK 中所森。因為這些 NDK librarys 已經(jīng)是 CMake 搜索路徑的一部分,你甚至不需要提供你本地安裝的 NDK 路徑夯接。你只需要向 CMake 提供你想使用的 library 名字焕济。

將find_library()命令添加到你的 CMake 構(gòu)建腳本中,這樣就可以定位 NDK library 的位置盔几,并將其位置存儲在一個變量之中晴弃。你可以在構(gòu)建腳本的其他地方使用這個變量,來代指 NDK library。下面的示例代碼將 Android-specific log support library 的位置存儲到變量 log-lib 中:

find_library( # Defines the nameofthe pathvariablethat stores the

????????????????????# locationofthe NDKlibrary.

????????????????????log-lib

????????????????????# Specifies the nameofthe NDKlibrarythat

????????????????????# CMake needstolocate.

????????????????????log )

NDK 同樣也包含一些只包含源碼的 library上鞠,這些就需要你去編譯际邻,然后鏈接到你的本地庫(native library)。你可以在 CMake 構(gòu)建腳本中使用 add_library() 命令將源碼編譯進(jìn)本地庫芍阎。這時就需要提供你的本地 NDK 安裝路徑世曾,通常將該路徑保存在 ANDROID_NDK 變量中,這樣 Android Studio 可以自動為你定義谴咸。

下面的命令告訴 CMake 去構(gòu)建 android_native_app_glue.c 轮听,這個命令可以管理 NativeActivity 的生命周期以及點擊輸入,并將其導(dǎo)入靜態(tài)庫中岭佳,然后將其鏈接至 native-lib :

add_library( app-glue

????????????????????STATIC

????????????????????${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c )

# You need to link static libraries against your shared native library.

target_link_libraries( native-lib app-glue${log-lib})

添加其他的預(yù)編譯庫

添加預(yù)編譯庫和添加本地庫(native library)類似血巍。由于預(yù)編譯庫是已經(jīng)構(gòu)建好的,你想就要使用 IMPORTED 標(biāo)志去告訴 CMake 珊随,你只需要將其導(dǎo)入到你的項目中即可:

add_library( imported-lib

SHARED

IMPORTED )

然后你需要使用 set_target_properties() 命令去指定庫的路徑藻茂,就像下面的代碼那樣。

一些庫會根據(jù)不同的 CPU 使用不同的包玫恳,或者是 Application Binary Interfaces(ABI) ,并且將他們歸類到不同的目錄中优俘。這樣做的好處是京办,可以充分發(fā)揮特定的 CPU 架構(gòu)。你可以使用 ANDROID_ABI 路徑變量帆焕,將多個 ABI 版本的庫添加到你的 CMake 構(gòu)建腳本中惭婿。這個變量使用了一些 NDK 默認(rèn)支持的 ABI,以及一些需要手動配置到 Gradle 的 ABI叶雹,比如:

add_library(...)

set_target_properties( #指定目標(biāo)庫财饥。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? imported-lib

????????????????????????????????????#指定要定義的參數(shù)。

????????????????????????????????????PROPERTIES IMPORTED_LOCATION

???????????????????????????????????#提供的路徑折晦,你要導(dǎo)入的庫钥星。

????????????????????????????????????imported-lib/src/${ANDROID_ABI}/libimported-lib.so )

為了讓 CMake 在編譯時期能找到你的頭文件,你需要使用 include_directories() 命令满着,并且將你的頭文件地址傳進(jìn)去:

include_directories( imported-lib/include/ )

在 CMake 構(gòu)建腳本中使用 target_link_libraries() 命令谦炒,將預(yù)構(gòu)建庫與你本地庫相關(guān)聯(lián):

target_link_libraries( native-lib imported-lib app-glue ${log-lib} )

當(dāng)你構(gòu)建你的 APP 的時候,Gradle 會自動將導(dǎo)入的庫打包到你的 APK 中风喇。你可以使用APK Analyzer來檢查宁改。有關(guān)CMake的命令的詳細(xì)信息,請參閱CMake的文檔魂莫。

關(guān)聯(lián)本地庫與 Gradle

為了將本地庫與 Gradle 相關(guān)聯(lián)还蹲,你需要在 CMake 或 ndk-build 構(gòu)建腳本中提供一個路徑地址。當(dāng)你構(gòu)建你的 APP 時,Gradle 會將 CMake 或 ndk-build 作為一個依賴運(yùn)行谜喊,然后將共享庫(.so 文件)打包到你的 APK 中潭兽。Gradle 同樣使用構(gòu)建腳本來識別哪些文件需要導(dǎo)入到 Android Studio 項目,你可以從 Project 窗口面板中看到相應(yīng)的文件锅论。如果你還沒有一個為 native sources 準(zhǔn)備的構(gòu)建腳本讼溺,你需要先創(chuàng)建一個CMake腳本,然后在繼續(xù)最易。

一旦你使用Gradle關(guān)聯(lián)了本地項目怒坯,AndroidStudio會在窗口更新項目的C/C++源文件和本地庫,和你外部構(gòu)建的腳本文件藻懒。

注意:當(dāng)你改變Gradle配置的時候剔猿,請確保在工具欄中點擊Sync Project

使用 Android Studio 圖形化界面

你可以使用 Android Studio 的圖形化界面來將 Gradle 與外部 CMake 或者 ndk-build 項目關(guān)聯(lián)起來。

打開 IDE 左邊的Project面板嬉荆,選擇 Android 归敬。

右鍵點擊你想鏈接本地庫的 module,比如app module鄙早,然后從菜單中選擇Link C++ Project with Gradle汪茧。你應(yīng)該能看見一個和下面圖片中的對話框。

在下拉菜單中限番,選擇 CMake 或者 ndk-build 舱污。

a. 如果你選擇 CMake ,需要在 Project Path 中指定 CMakeLists.txt 腳本文件的路徑弥虐。

b. 如果你選擇 ndk-build 扩灯,你需要在 Project Path 中指定 Android.mk 腳本文件的路徑。

點擊 OK霜瘪。

配置 Gradle

如果要手動將 Gradle 與你的本地庫相關(guān)聯(lián)珠插,你需要在 module 層級的 build.gradle 文件中添加 externalNativeBuild {} 代碼塊,并且在該代碼塊中配置cmake {}或ndkBuild {} :

android {...defaultConfig {...}

buildTypes {...}

// Encapsulates your external native build configurations.

externalNativeBuild {

????// Encapsulates your CMake build configurations.

????cmake {

????????// Provides a relative path to your CMake build script.

????????path"CMakeLists.txt"}

????}

}

可選配置

你可以在你的 module 層級的 build.gradle 文件中的 defaultConfig {} 代碼塊中颖对,添加 externalNativeBuild {} 代碼塊捻撑,為 CMake 或 ndk-build 配置一些額外參數(shù)。當(dāng)然缤底,你也可以在你的構(gòu)建配置中的其他每一個生產(chǎn)渠道重寫這些屬性布讹。

比如,如果你的 CMake 或者 ndk-build 項目中定義了多個本地庫训堆,你想在某個生產(chǎn)渠道使用這些本地庫中的幾個描验,你就可以使用 targets 屬性來構(gòu)建和打包。下面的代碼展示了一些你可能會用到的屬性:

android {

????...

????defaultConfig {

????????...

????????// This block is different from the one you use to link Gradle

????????// to your CMake or ndk-build script.

????????externalNativeBuild {

????????????// For ndk-build, instead use ndkBuild {}

????????????cmake {

????????????????// Passes optional arguments to CMake.

????????????????arguments "-DCMAKE_VERBOSE_MAKEFILE=TRUE"http:// Sets optional flagsforthe C compiler.

????????????????cFlags "-D_EXAMPLE_C_FLAG1","-D_EXAMPLE_C_FLAG2"http:// Sets a flag to enable format macro constantsforthe C++ compiler.

????????????????cppFlags" -D__STDC_FORMAT_MACROS"}

????????????}

????????}

????????buildTypes {...}

????????productFlavors {

????????????...

????????????demo {

????????????????...

????????????????externalNativeBuild {

????????????????????cmake {

????????????????????????...// Specifies which native libraries to build and packageforthis

????????????????????????????// product flavor. If you don't configure this property, Gradle

????????????????????????????// builds and packages all shared object libraries that you define

????????????????????????????// in your CMake or ndk-build project.

????????????????????????????targets "native-lib-demo"

????????????????????}

????????????????}

????????????}

????????????paid {

????????????????...

????????????????externalNativeBuild {

????????????????????cmake {

????????????????????????...

????????????????????????targets "native-lib-paid"

????????????????????}

????????????????}

????????????}

}

????// You use this block to link Gradle to your CMake or ndk-build script.

????externalNativeBuild {

????????cmake {...}

????????// or ndkBuild {...}

????}

}

----------

指定 ABI

默認(rèn)的情況下坑鱼,Gradle 會將你的本地庫構(gòu)建成 .so 文件膘流,然后將其打包到你的 APK 中絮缅。如果你想 Gradle 構(gòu)建并打包某個特定的 ABI 。你可以在你的 module 層級的 build.gradle 文件中使用 ndk.abiFilters 標(biāo)簽來指定他們:

android {

????...

????defaultConfig {

????????...

????????externalNativeBuild {

????????????cmake {...}

????????????// or ndkBuild {...}

????????}

????????ndk {

????????????// Specifies the ABI configurations of your native

????????????// libraries Gradle should build and package with your APK.

????????????abiFilters'x86','x86_64','armeabi','armeabi-v7a','arm64-v8a'

????????}

????}

????buildTypes {...}

????externalNativeBuild {...}

}

大多數(shù)情況呼股,你只需要在 ndk {} 代碼塊中指定 abiFilters 就可以了耕魄;如上代碼。它會告訴Gradle來構(gòu)建編譯不同的平臺彭谁,但是吸奴,如果你想控制 Gradle 構(gòu)建什么,獨(dú)立打包到你的apk中缠局,那就在defaultConfig.externalNativeBuild.cmake {}代碼塊或defaultConfig.externalNativeBuild.ndkBuild {}代碼塊中则奥,配置其他的 abiFilters 標(biāo)簽。Gradle 會構(gòu)建那些 ABI 配置狭园,但是只會將 defaultConfig.ndk {} 代碼塊中指定的配置打包到 apk 中读处。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市唱矛,隨后出現(xiàn)的幾起案子罚舱,更是在濱河造成了極大的恐慌,老刑警劉巖绎谦,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件管闷,死亡現(xiàn)場離奇詭異,居然都是意外死亡窃肠,警方通過查閱死者的電腦和手機(jī)渐北,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铭拧,“玉大人,你說我怎么就攤上這事恃锉〔笃校” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵破托,是天一觀的道長肪跋。 經(jīng)常有香客問我,道長土砂,這世上最難降的妖魔是什么州既? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮萝映,結(jié)果婚禮上吴叶,老公的妹妹穿的比我還像新娘。我一直安慰自己序臂,他們只是感情好蚌卤,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布实束。 她就那樣靜靜地躺著,像睡著了一般逊彭。 火紅的嫁衣襯著肌膚如雪咸灿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天侮叮,我揣著相機(jī)與錄音避矢,去河邊找鬼。 笑死囊榜,一個胖子當(dāng)著我的面吹牛审胸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播锦聊,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼歹嘹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了孔庭?” 一聲冷哼從身側(cè)響起尺上,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎圆到,沒想到半個月后怎抛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡芽淡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年马绝,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挣菲。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡富稻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出白胀,到底是詐尸還是另有隱情椭赋,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布或杠,位于F島的核電站哪怔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏向抢。R本人自食惡果不足惜认境,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望挟鸠。 院中可真熱鬧叉信,春花似錦、人聲如沸艘希。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鸠姨,卻和暖如春铜秆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背讶迁。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工连茧, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人巍糯。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓啸驯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親祟峦。 傳聞我的和親對象是個殘疾皇子罚斗,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

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