編輯:關於Android編程
1.環境配置
(溫馨提示,圖片看不清楚的,可以點擊鼠標右鍵,在新選項卡中查看圖片^^)
1)打開studio建立新的工程,打開如下位置,下載紅線所示的ndk及LLDB工具。
2)如下所示對ndk進行設置
3)替換掉原來的gradle工具,如圖注釋掉上面的,加入下面的代碼。
4)修改app下面的gradle文件
給出完整代碼,仔細辨別
apply plugin: 'com.android.model.application' model { //這一行是新加的,對應上邊的修改, /** * 這裡要注意一下,如果使用gradle-experimental,參數賦值要使用 = 號,而不是空格, * 所以要把原來文件中的空格都用等號去替換; * 還有一部分參數使用的函數也與原來不一樣, * 實在不能確定的就找出ndk samples中的build.gradle文件對比一下。 */ android { compileSdkVersion = 23 buildToolsVersion = "23.0.2" defaultConfig { applicationId = "com.ndk.zhang" minSdkVersion.apiLevel = 10 //這兩個參數和原來有點不一樣,多了apiLevel targetSdkVersion.apiLevel = 23 versionCode = 1 versionName = "1.0" } ndk { //NDK設置 moduleName = "test" //動態庫的名稱 toolchain = 'clang' //編譯器,據說這個比gcc要快,沒有這個寫native代碼時沒有自動補全的功能 CFlags.addAll(['-Wall', '-DHELLO_2']) //對應gcc中的編譯選項 CFLAGS,方括號內是一個數組,可以有多個值 CFlags.add("-DHELLO_3") // CFlags += "-DHELLO" //這種方式在這裡行不通,包括以下的ldFlags, ldLibs 也一樣. ldFlags.addAll(["-L../lib"]) //庫文件路徑 ldLibs.addAll(['log']) //庫文件名 stl = "stlport_static" //指示使用動態庫還是靜態庫 } buildTypes { release { minifyEnabled = true proguardFiles.add(file('proguard-rules.pro')) //這是把原來的改成這樣的 } debug { ndk.debuggable = true //有這個才會支持調試native 代碼,這個放到release裡一樣能用 } } productFlavors { /** copy過來的,根據不同的平台,會有不同的配置 */ // for detailed abiFilter descriptions, refer to "Supported ABIs" @ // https://developer.android.com/ndk/guides/abis.html#sa create("arm") { ndk.abiFilters.add("armeabi") } create("arm7") { ndk.abiFilters.add("armeabi-v7a") } create("arm8") { ndk.abiFilters.add("arm64-v8a") } create("x86") { ndk.abiFilters.add("x86") } create("x86-64") { ndk.abiFilters.add("x86_64") } create("mips") { ndk.abiFilters.add("mips") } create("mips-64") { ndk.abiFilters.add("mips64") } // To include all cpu architectures, leaves abiFilters empty // create("all") } } } //這個是對就 model{ //android { // compileSdkVersion 23 // buildToolsVersion "23.0.2" // // defaultConfig { // applicationId "com.ndk.zhang" // minSdkVersion 10 // targetSdkVersion 23 // versionCode 1 // versionName "1.0" // } // buildTypes { // release { // minifyEnabled false // proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' // } // } //} dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.4.0' }
完整代碼
public class Test { static { System.loadLibrary("test"); } public native void test(); }
6)新建jni文件夾
7)這個時候Test.java文件是提示錯誤的,alt+enter出現如下效果
8)點擊這個Create function ...即可生成.c文件在jni文件夾。打開c文件輸入代碼,結果如圖
完整代碼
#include#include "android/log.h" JNIEXPORT void JNICALL Java_com_ndk_zhang_Test_test(JNIEnv *env, jobject instance) { __android_log_write(ANDROID_LOG_ERROR,"TAG","TEST"); }
9)Terminal進入到src/main/java下面
10)debug起來,如果出現如下log說明成功了 11)如果想進行調試,很簡單。選擇app-native,然後在c文件中打斷點就可以進行調試了。注意,如果出現手機卡在debug頁面不動的情況,可以點擊sudio的Run->attach debugger to android process就可以了。 其它問題慢慢補充,有問題可以留言。 補充 1.發現生成.so文件找不到,網上說到build->intermediates->ndk查找,但是死活找不到,後來發現在build->intermediates->binaries文件下面。 2.生成so文件方法,rebuild project是一種,其實只要跑完debug模式就會有debug版本的so生成,如果進行apk打包操作就會有release版本生成。 3.補充個app下面gradle文件的配置信息。注釋部分刪除掉無影響。而且很多語句也沒用上所以也注釋掉了。
apply plugin: 'com.android.model.application' model { //這一行是新加的,對應上邊的修改, /** * 這裡要注意一下,如果使用gradle-experimental,參數賦值要使用 = 號,而不是空格, * 所以要把原來文件中的空格都用等號去替換; * 還有一部分參數使用的函數也與原來不一樣, * 實在不能確定的就找出ndk samples中的build.gradle文件對比一下。 */ android { compileSdkVersion = 23 buildToolsVersion = "23.0.2" defaultConfig { applicationId = "com.ndk.zhang" minSdkVersion.apiLevel = 10 //這兩個參數和原來有點不一樣,多了apiLevel targetSdkVersion.apiLevel = 23 versionCode = 1 versionName = "1.0" } ndk { //NDK設置 moduleName = "test" //動態庫的名稱 toolchain = 'clang' //編譯器,據說這個比gcc要快,沒有這個寫native代碼時沒有自動補全的功能 // CFlags.addAll(['-Wall', '-DHELLO_2']) //對應gcc中的編譯選項 CFLAGS,方括號內是一個數組,可以有多個值 // CFlags.add("-DHELLO_3") // // CFlags += "-DHELLO" //這種方式在這裡行不通,包括以下的ldFlags, ldLibs 也一樣. // ldFlags.addAll(["-L../lib"]) //庫文件路徑 ldLibs.addAll(['log']) //庫文件名 // stl = "stlport_static" //指示使用動態庫還是靜態庫 } buildTypes { release { minifyEnabled = true proguardFiles.add(file('proguard-rules.pro')) //這是把原來的改成這樣的 } debug { ndk.debuggable = true //有這個才會支持調試native 代碼,這個放到release裡一樣能用 } } productFlavors { /** copy過來的,根據不同的平台,會有不同的配置 */ create("all"){ } } } }4.針對生成so文件的問題說一下,如果根據補充中2,3步都生成不成功,建議利用補充中第3步文件進行替換,因為我是再改成3中代碼後找到的so文件,目前也不清楚是gradle文件導致的,還是我開始沒仔細看所以沒找到,這裡不再測試,知道的同學麻煩留言告知一下。這裡主要補充一個proguard說明,針對那些對Proguard不熟悉的同學,請在你的Proguard文件中加上如下代碼,此代碼是為了防止你打包的時候被混淆,最後報錯。
-keepclasseswithmembers,allowshrinking class * { native5.愛看英文的給個官方網址,搭建方式跟這個一樣http://tools.android.com/tech-docs/new-build-system/gradle-experimental。; }
1,intentfilter說明:如果說是將一個activity有其他應用打開,或者是在webView 或者 bybird app中調用我們自己的activi
最近做了一個百度地圖離線地圖的功能,雖然功能實現了,但過程中也碰到了一些問題。首先,看看效果圖吧。 1、離線地圖相關APIAPI地址:http://wiki.lbsyu
昨天將框架整合完成,現在我主要實現昨天的需求,實現商品的列表查詢,這時要涉及到jsp和serveilet知識,不清楚的朋友可以趕緊去補充下知識。1、商品列表的實現1.1、
工廠方法模式,往往是設計模式初學者入門的模式,的確,有人稱之為最為典型最具啟發效果的模式。android中用到了太多的工廠類,其中有用工廠方法模式的,當然也有很多工廠並不