<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ### 14.2 NDK的開發流程 NDK的開發是基于JNI的,其主要由如下幾個步驟。 * 1.下載并配置NDK 首先要從Android官網上下載NDK,下載地址為https://developer.android.com/ndk/downloads/index.html,本章中采用的NDK的版本是android-ndk-r10d。下載完成以后,將NDK解壓到一個目錄,然后為NDK配置環境變量,步驟如下所示。 首先打開當前用戶的環境變量配置文件: vim ~/.bashrc 然后在文件后面添加如下信息:export PATH=~/Android/android-ndk-r10d:$PATH,其中~/Android/android-ndk-r10d是本地的NDK的存放路徑。 添加完畢后,執行source ~/.bashrc來立刻刷新剛剛設置的環境變量。設置完環境變量后,ndk-build命令就可以使用了,通過ndk-build命令就可以編譯產生so庫。 * 2.創建一個Android項目,并聲明所需的native方法 package com.ryg.JniTestApp; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.widget.TextView; public class MainActivity extends ActionBarActivity { static { System.loadLibrary("jni-test"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView textView = (TextView)findViewById(R.id.msg); textView.setText(get()); set("hello world from JniTestApp"); } public native String get(); public native void set(String str); } 3.實現Android項目中所聲明的native方法 在外部創建一個名為jni的目錄,然后在jni目錄下創建3個文件:test.cpp、Android.mk和Application.mk,它們的實現如下所示。 // test.cpp #include <jni.h> #include <stdio.h> #ifdef __cplusplus extern "C" { #endif jstring Java_com_ryg_JniTestApp_MainActivity_get(JNIEnv *env, jobject thiz){ printf("invoke get in c++\n"); return env->NewStringUTF("Hello from JNI in libjni-test.so ! "); } void Java_com_ryg_JniTestApp_MainActivity_set(JNIEnv *env, jobject thiz, jstring string) { printf("invoke set from C++\n"); char* str = (char*)env->GetStringUTFChars(string, NULL); printf("%s\n", str); env->ReleaseStringUTFChars(string, str); } #ifdef __cplusplus } #endif // Android.mk # Copyright (C) 2009 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := jni-test LOCAL_SRC_FILES := test.cpp include $(BUILD_SHARED_LIBRARY) // Application.mk APP_ABI := armeabi 這里對Android.mk和Application.mk做一下簡單的介紹。在Android.mk中,LOCAL_MODULE表示模塊的名稱,LOCAL_SRC_FILES表示需要參與編譯的源文件。Application.mk中常用的配置項是APP_ABI,它表示CPU的架構平臺的類型,目前市面上常見的架構平臺有armeabi、x86和mips,其中在移動設備中占據主要地位的是armeabi,這也是大部分apk中只包含armeabi類型的so庫的原因。默認情況下NDK會編譯產生各個CPU平臺的so庫,通過APP_ABI選項即可指定so庫的CPU平臺的類型,比如armeabi,這樣NDK就只會編譯armeabi平臺下的so庫了,而all則表示編譯所有CPU平臺的so庫。 4.切換到jni目錄的父目錄,然后通過ndk-buiId命令編譯產生so庫 這個時候NDK會創建一個和jni目錄平級的目錄libs, libs下面存放的就是so庫的目錄,如圖14-1所示。需要注意的是,ndk-build命令會默認指定jni目錄為本地源碼的目錄,如果源碼存放的目錄名不是jni,那么ndk-build則無法成功編譯。 [插圖] 圖14-1 通過NDK編譯產生的so庫 然后在app/src/main中創建一個名為jniLibs的目錄,將生成的so庫復制到jniLibs目錄中,然后通過AndroidStudio編譯運行即可,運行效果如圖14-2所示。這說明從Android中調用so庫中的方法已經成功了。 [插圖] 圖14-2 Android中調用so庫中的方法示例 在上面的步驟中,需要將NDK編譯的so庫放置到jniLibs目錄下,這個是AndroidStudio所識別的默認目錄,如果想使用其他目錄,可以按照如下方式修改App的build.gradle文件,其中jniLibs.srcDir選項指定了新的存放so庫的目錄。 android { ... sourceSets.main { jniLibs.srcDir 'src/main/jni_libs' } } 除了手動使用ndk-build命令創建so庫,還可以通過AndroidStudio來自動編譯產生so庫,這個操作過程要稍微復雜一些。為了能夠讓AndroidStudio自動編譯JNI代碼,首先需要在App的build.gradle的defaultConfig區域內添加NDK選項,其中moduleName指定了模塊的名稱,這個名稱指定了打包后的so庫的文件名,如下所示。 android { ... defaultConfig { applicationId "com.ryg.JniTestApp" minSdkVersion 8 targetSdkVersion 22 versionCode 1 versionName "1.0" ndk { moduleName "jni-test" } } } 接著需要將JNI的代碼放在app/src/main/jni目錄下,注意存放JNI代碼的目錄名必須為jni,如果不想采用jni這個名稱,可以通過如下方式來指定JNI的代碼路徑,其中jni.srcDirs指定了JNI代碼的路徑: android { ... sourceSets.main { jni.srcDirs 'src/main/jni_src' } } 經過了上面的步驟,AndroidStudio就可以自動編譯JNI代碼了,但是這個時候AndroidStudio會把所有CPU平臺的so庫都打包到apk中,一般來說實際開發中只需要打包armeabi平臺的so庫即可。要解決這個問題也很簡單,按照如下方式修改build.gradle的配置,然后在Build Variants面板中選擇armDebug選項進行編輯就可以了。 android { ... productFlavors { arm { ndk { abiFilter "armeabi" } } x86 { ndk { abiFilter "x86" } } } } 如圖14-3所示,可以看到apk中就只有armeabi平臺的so庫了。 :-: ![](https://img.kancloud.cn/ea/48/ea48bd30d4ad7f270227739602ce91ea_708x601.png) 圖14-3 AndroidStudio打包后的apk
                  <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>

                              哎呀哎呀视频在线观看