將應用代碼由eclipse導入Android studio的方法NDK-Build和Cmake兩種方法(以android_serialport_api爲例)

網上翻了幾百篇博客,看了半天,要不就是寫的亂七八糟看不懂,要不就是隱藏了一些細節,要不就是實現不了,最後仍是在Android官網上看明白了,並且說得有條有理,之後遇到不懂的必定要先翻官網。html

參考資料:https://developer.android.com/studio/projects/add-native-code.html?utm_source=android-studio#link-gradlejava

 

1. 導入eclipse到Android studio

1. 導入工程:

點擊以下所示:android

 

導入以後會生成錯誤和一個文件:api

1). 生成的錯誤:android-studio

Gradle 'android-serialport-api-master' project refresh failed

Error:Minimum supported Gradle version is 4.1. Current version is 2.14.1. If using the gradle wrapper, try editing the distributionUrl in F:\AndroidWork\AndroidStudio\android-serialport-api-master\gradle\wrapper\gradle-wrapper.properties to gradle-4.1-all.zip

Consult IDE log for more details (Help | Show Log)

 

從上面可知是gradle版本過低,須要升級gradle網絡

解決辦法:修改gradle-wrapper.propertiesapp

 

#Fri Nov 10 19:29:01 CST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip   //修改成警告對應的版本

 

2). 生成了一個import-summary.txteclipse

 

下面對該文件進行說明ide

ECLIPSE ANDROID PROJECT IMPORT SUMMARY
======================================

Ignored Files:     //忽略掉的文件 --------------
The following files were *not* copied into the new Gradle project; you
should evaluate whether these are still needed in your project and if
so manually move them:

* README.md
* run_emulator.sh

Moved Files:    //移除掉的文件 ------------

/*由於安卓gradle工程和eclipse的ADT使用的構建工程的方法不一樣,因此這裏對一些工程目錄進行了重構*/ Android Gradle projects use a different directory structure than ADT Eclipse projects. Here's how the projects were restructured: /*舉例:eclipse目錄下的jni\改成Android studio目錄下的ManiMenu\src\main\jni\
*/
* AndroidManifest.xml => MainMenu\src\main\AndroidManifest.xml * jni\ => MainMenu\src\main\jni\ * res\ => MainMenu\src\main\res\ * src\ => MainMenu\src\main\java\ Next Steps: //接下啦須要作的事情 -----------
/*須要網絡去下載一些依賴的庫或者對應的SDK之類的東西*/ You can now build the project. The Gradle project needs network connectivity to download dependencies. Bugs: ----- If for some reason your project does not build, and you determine that it is due to a bug or limitation of the Eclipse to Gradle importer, please file a bug at http://b.android.com with category Component-Tools. (This import summary is for your information only, and can be deleted after import once you are satisfied with the results.)

 

2. 修改build.gradle:

 

由於咱們的應用只是用在Android4.2.2上面,對應的SDK版本爲17。(看了eclipse上所有都是17,因此應該不用考慮兼容其餘版本的應用,照着改)工具

若是不記得,看看這兩篇:

Android studio的gradle

Android系統版本、平臺版本、SDK版版本、gradle修改

 

android {
    compileSdkVersion 17   //修改這裏,編譯版本的SDK
    buildToolsVersion "27.0.1"

    defaultConfig {
        applicationId "android_serialport_api.sample"
        minSdkVersion 17   //修改這裏,最小的SDK版本
        targetSdkVersion 17  //修改這裏,目標的SDK版本

        ndk {
            moduleName "serial_port"
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
}

 

這個時候Android studio會去網上把對應的SDK下載下來,等待幾分鐘

 

3. 編譯不經過(沒法構建本地C++系統)

再次編譯,發生錯誤

Information:Gradle tasks [:MainMenu:assembleDebug]
Error:Execution failed for task ':MainMenu:compileDebugNdk'.
> Error: Your project contains C++ files but it is not using a supported native build system.  //工程沒法使用本地C++構建系統
  Consider using CMake or ndk-build integration. For more information, go to:
   https://d.android.com/r/studio-ui/add-native-code.html   
  Alternatively, you can use the experimental plugin:
   https://developer.android.com/r/tools/experimental-plugin.html
Information:BUILD FAILED in 3s
Information:1 error
Information:0 warnings
Information:See complete output in console

 

這個時候下載三個軟件:

其中:

NDK:經過NDK-build方法來使用本地庫

CMake:經過CMake方法來使用本地庫

LLDB:用來調試C/C++的工具

 

2. 方法一:將gradle經過NDK-build關聯到本地庫

1). 方法一: 

注意:NKD-build在Android studio3.0版本之後就不能再用了,必須使用CMke,不過我以爲3.0並非很好用,好比安裝的時候沒有選擇SDK路徑,默認C盤,每次安裝完又忘記改,搞得C盤愈來愈大,換回2.3接着用,還可使用NDK-build

 

1). 將Android studio查看方法改成Android視圖。

2). 選擇Link C++ Project with Gradle

3). 選擇ndk-build。

4). Project Path 旁的字段爲您的外部 ndk-build 項目指定Android.mk 腳本文件。

 

編譯OK。完成

 

2). 分析總結:

查看android-serialport-api-master\MainMenu\build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 17
    buildToolsVersion "27.0.1"

    defaultConfig {
        applicationId "android_serialport_api.sample"
        minSdkVersion 17
        targetSdkVersion 17

        ndk {
            moduleName "serial_port"    //這裏已經自動添加了
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
    externalNativeBuild {
        ndkBuild {
            path 'src/main/jni/Android.mk'
        }
    }
}

 

首先查看Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

TARGET_PLATFORM := android-3
LOCAL_MODULE    := serial_port   //生成的庫的名字應該爲libserial_port.so
LOCAL_SRC_FILES := SerialPort.c
LOCAL_LDLIBS    := -llog

include $(BUILD_SHARED_LIBRARY)

 

查看目錄android-serialport-api-master\MainMenu\build\intermediates\ndkBuild\debug\obj\local:已經生成了相應的庫libserial_port.so

 

 

 

 

 

虛擬機效果:

 

3. 方法二:將gradle經過CMake關聯到本地庫

使用的時候忘記保存流程了,懶得再去試一遍,跟NDK-build方法差很少,就是選擇方法的時候改一下,具體能夠看上面貼的官網,要是之後有時間再寫上吧。

相關文章
相關標籤/搜索