<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                接續上個系列之 __[ JNI開發系列 ]__: [JNI開發系列①JNI概念及開發流程](http://www.jianshu.com/p/68bca86a84ce) [JNI開發系列②.h頭文件分析](http://www.jianshu.com/p/cba836f6a08c) [JNI開發系列③C語言調用Java字段與方法](http://www.jianshu.com/p/9cc6e3f0ead7) [JNI開發系列④C語言調用構造方法](http://www.jianshu.com/p/b0403771944f) [JNI開發系列⑤對象引用的處理](http://www.jianshu.com/p/09469f692a4b) ### 前情提要 上個系列,我們學習了Java與C/C++的交互 , 使用Java調用C/C++函數,使用C/C++調Java的方法和創建Java對象等等 。在上個系列中 , 我們使用的是Eclipse與VS進行的開發 , 因為延續的是[C語言基礎系列](http://www.jianshu.com/p/4701cd1e1914)的做法 , 所以開發工具未作切換 。 在NDK系列中 , 我們將采用最新的Android Studio進行開發 , 版本是`Android studio 2.2 RC 2` , NDK版本采用的是最新的`r12b` 。 ### 開發環境 工具下載地址 (win)(需要科學上網) : Android Studio 2.2 RC2 --- [Android Studio Download 2.2 RC2](https://dl.google.com/dl/android/studio/ide-zips/2.2.0.11/android-studio-ide-145.3253452-windows.zip) Android NDK r12b --- [Android NDK r12b 64bit](https://dl.google.com/android/repository/android-ndk-r12b-windows-x86_64.zip) Android NDK r12b --- [Android NDK r12b 32bit](https://dl.google.com/android/repository/android-ndk-r12b-windows-x86.zip) > 國內鏡像站: [androiddevtools](http://www.androiddevtools.cn/) ### 關于開發環境的說明 因為在`Android studio 2.2`之前的版本 , 對C/C++支持不是很好 , 也沒有語法提示 , 寫起來不是很方便 , 構建工具也不是很完整 , 所有采用最新的`Android studio 2.2 RC2`來進行編寫 ,但 , `Android studio 2.2 RC2` 還是Beta版本 ,所有 , 不建議現在應用到生產環境中 , 等google發布了Stable版本之后再應用 。 目前建議 , 可以使用`Eclipse`編寫`.so` , 然后應用到現在的生產環境中 。 ### 創建NDK項目 > 第一步 , 創建支持C++的項目 ![C++ support](http://upload-images.jianshu.io/upload_images/643851-b15dc1376c8c2430.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 其他的選項使用默認的即可 。 > 第二步 , 關聯NDK 創建完成之后會報如下錯誤: ![ndk r12b](http://upload-images.jianshu.io/upload_images/643851-0b70deabda8b9346.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 在項目配置中 , 關聯NDK之后就會ok ![config ndk](http://upload-images.jianshu.io/upload_images/643851-3fe9ba5c00088b07.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) > 第三步 , 編寫native類及處理方法 在創建項目的時候 , 勾選了C++ support , 項目創建完成之后 , 會自動幫我們生成一個`cpp/native-lib.cpp` ![auto create cpp file](http://upload-images.jianshu.io/upload_images/643851-e5a5ebc788106c83.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 你可以不用修改文件名 , 在新建`native`方法的時候 , 會提示你創建一個C++的JNI函數 , 直接創建就會生成一個JNI函數 , 都不用使用`javah`生成一個頭文件 , 然后再引入頭文件了 , 非常之方便 。 ![auto create jni function 1](http://upload-images.jianshu.io/upload_images/643851-91231d255bd06de6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 創建函數: ![auto create jni function 2](http://upload-images.jianshu.io/upload_images/643851-a0bbc2ac186a1601.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 在這里 , 就不使用默認的`.cpp`文件了 , 我們新建一個`.c`文件 , 創建了`HelloNDK.c`文件之后 , Android Studio會提示我們 , 需要在`Android.mk/CMakeLists.txt`中進行聲明 , 這里 , 我們使用默認的`CMakeLists.txt`建構工具 (創建項目的時候自動生成)。 > 第四步 , build.gradle配置: ```java externalNativeBuild { cmake { cppFlags "" // 指定只用clang編譯器 // Clang是一個C語言、Objective-C、C++語言的輕量級編譯器。 arguments "-DANDROID_TOOLCHAIN=clang" // 生成.so庫的目標平臺 abiFilters "armeabi-v7a" , "armeabi" } } // 配置CMakeLists.txt路徑 externalNativeBuild { cmake { path "CMakeLists.txt" } } ``` > 第五步 , 修改CMakeLists.txt ``` add_library( # Sets the name of the library. HelloNDK # 生成的.so庫文件名稱 # Sets the library as a shared library. SHARED # Provides a relative path to your source file(s). # Associated headers in the same location as their source # file are automatically included. # 需要生成的.so庫的文件路徑 src/main/cpp/HelloNDK.c ) target_link_libraries( # Specifies the target library. # 項目鏈接的.so庫名稱 HelloNDK # Links the target library to the log library # included in the NDK. ${log-lib} ) ``` > 第六步 , 編寫`native`方法,以及C函數 ```java /** * Created by Zeno on 2016/9/10. * * NDK Demo */ public class HelloNDK { public static native String sayHelloNDK() ; static { System.loadLibrary("HelloNDK"); } } ``` ```c #include <jni.h> JNIEXPORT jstring JNICALLJava_com_zeno_encryptanddecrypt_ndk_HelloNDK_sayHelloNDK(JNIEnv *env, jclass thiz) { // TODO return (*env)->NewStringUTF(env, "this String come from C "); } ``` `native`方法的編寫以及C函數的寫法, 我們都非常熟悉了 , 這里就不再解釋各自的意義了 。 > 第七步 , 編譯 ![make](http://upload-images.jianshu.io/upload_images/643851-f8174b491f430b00.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 編譯完成之后 ,我們可以切換到`project`視圖,來查看`.so`文件 ![make success](http://upload-images.jianshu.io/upload_images/643851-187240a411969045.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) > 第八步 , 運行 ![run](http://upload-images.jianshu.io/upload_images/643851-a838074a544d9331.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 如果使用的是genymotion模擬器 , 這需要在`abiFilters`加入`x86` ,不然項目會運行不起來的 。 當然, 也可以使用一個genymotion的`arm`插件 , 這樣不配置`x86`也可以運行 。 ``` // 生成.so庫的目標平臺 abiFilters "armeabi-v7a" , "armeabi" , "x86" ``` ### 結語 做為Android開發者 , 從最開始的Eclipse開發工具 , 到現在日漸成熟的Android Studio , 還有幾乎可以看得見成長的Android System , 我很慶幸 , 從一開始就選擇了Android平臺 , 從初學Android到現在的日漸深入 , Android在成長 , 我也在成長 。見證了Android從一個丑小鴨變成了 , 一個羽翼漸豐的白天鵝 , 不論從操作系統的易用性和UI友好性 , 它的成長都是有目共睹的 。感謝Android 。 > 每一個人的成長背后 , 都離不開所有人支持 , 我們是一個單獨的個體 , 又是社會網狀結構的一個點 , 我們既獨立又互相聯系 。 本文由[動腦學院](http://www.dongnaoedu.com/)特約贊助 , 祝各位老司機節日快樂 ! ### 關于Android Studio 2.2 我很期待這個版本 , 對于C/C++的支持非常友好 , 省卻了很多繁瑣的操作 , 比Eclipse好用的太多 。 ### 參考 [Building C++ in Android Studio with CMake or ndk-build](http://tools.android.com/tech-docs/external-c-builds)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看