Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 如何優雅地使用NDK[功能補充]

如何優雅地使用NDK[功能補充]

編輯:關於Android編程

說在前面的話:這篇文章是看了如何優雅地使用NDK後,對原博客功能的補充。為了方便大家的閱讀順序,直接添加到原博客之中,如有侵犯版權,請聯系我。這篇博客有轉載,有原創,只是在原博客上做了修改,故分類到原創,如有不對,請大家留言指正。
本博客轉載地址如下:
如何優雅地使用NDK

在Android Studio上使用了一段時間的NDK,感覺官方的插件com.android.tools.build.gradle-experimental還是不夠穩定,存在一定問題,不過谷歌也聲明了這個插件是在實驗性階段。幸好官方在Android Studio上提供了另一種方式使用NDK,這篇博客就講講這種到目前為止我覺得非常贊的方法。

開發環境

基礎的安卓開發環境:Android Studio、SDK、JDK 下載好NDK,自己手動下載或者用SDK工具下載都可以
我使用的版本:Android Studio 1.5.1

配置常用命令

NDK開發比較常用的命令就是生成頭文件、構建so包,在android studio上我們可以先配置好命令,使用起來就很方便了,這是我感覺最贊的地方。

如下圖所示,我添加了三個命令,按加號添加
這裡寫圖片描述
其中一個命令的配置詳情如下圖:
這裡寫圖片描述

命令配置參數:

javah用於生成頭文件

Program:$JDKPath$/bin/javah<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KCjxwPlBhcmFtZXRlcnM6IDxjb2RlPi1lbmNvZGluZyBVVEYtOCAtZCAuLi9qbmkgLWpuaSAkRmlsZUNsYXNzJDwvY29kZT48L3A+Cgo8cD7XotLio7rV4rj2w/zB7s7SvNPJz8HLLWVuY29kaW5nIFVURi041ri2qLHgwuujrMTjv8nS1LjEs8nE47mks8y1xLHgwuuhozwvcD4KCjxwPldvcmtpbmcgZGlyZWN0b3J5OiA8Y29kZT4kU291cmNlcGF0aEVudHJ5JFwuLlxqYXZhPC9jb2RlPjwvcD4KCjxwPm5kay1idWlsZNPD09q5ub2oc2+w/DwvcD4KCjxwPlByb2dyYW06IDxjb2RlPsTjtcROREvEv8K8XGJ1aWxkXG5kay1idWlsZC5jbWQ8L2NvZGU+PC9wPgoKPHA+16LS4qO6d2luZG93c9PDPGNvZGU+bmRrLWJ1aWxkLmNtZDwvY29kZT4sTUFDL0xpbnV408M8Y29kZT5uZGstYnVpbGQ8L2NvZGU+PC9wPgoKPHA+UGFyYW1ldGVyczogyrLDtLa8srvTw8zuPC9wPgoKPHA+V29ya2luZyBkaXJlY3Rvcnk6PGNvZGU+JE1vZHVsZUZpbGVEaXIkXHNyY1xtYWluPC9jb2RlPjwvcD4KCjxwPm5kay1idWlsZCBjbGVhbsfls/1zb7D8PC9wPgoKPHA+UHJvZ3JhbTogPGNvZGU+xOO1xE5ES8S/wrxcYnVpbGRcbmRrLWJ1aWxkLmNtZDwvY29kZT48L3A+Cgo8cD7XotLio7p3aW5kb3dz08M8Y29kZT5uZGstYnVpbGQuY21kPC9jb2RlPixNQUMvTGludXjTwzxjb2RlPm5kay1idWlsZDwvY29kZT48L3A+Cgo8cD5QYXJhbWV0ZXJzOiBjbGVhbjwvcD4KCjxwPldvcmtpbmcgZGlyZWN0b3J5Ojxjb2RlPiRNb2R1bGVGaWxlRGlyJFxzcmNcbWFpbjwvY29kZT48L3A+Cgo8cD48c3Ryb25nPj09PT09PT09PT3V4sDv1K2yqb/Nw7vT0KOssrmz5L+qyrw9PT09PT09PT09PC9zdHJvbmc+IDxicj4KPHN0cm9uZz5tYWtlZmlsZSDTw9PayfqzyWFuZHJvaWQubWu6zWFwcGxpY2F0aW9uLm1rPC9zdHJvbmc+IDxicj4KPHN0cm9uZz7S1Lywz/JncmFkbGUucHJvcGVydGllc7rNbG9jYWwucHJvcGVydGllc87EvP7W0MztvNO1xLnMtqjF5NbDPC9zdHJvbmc+PC9wPgoKPHA+PGltZyBzcmM9"/uploadfile/Collfiles/20160509/20160509091228228.png" alt="這裡寫圖片描述" title="\">

Program: 你的NDK目錄\makefile.cmd

注意:makefile.cmd源碼如下,請自行放到對應上面的目錄

Parameters: $FileName$ $ProjectFileDir$

Working directory: $FileDir$

makefile.cmd源代碼如下:

@echo off
rem 參數1無需手動傳入,右鍵執行makefile命令即可
rem c/c++源文件名(帶後綴名)
set Paramter1=%1
rem 參數2項目所在目錄
set Paramter2=%2
set Dot=%Paramter1:~-2,-1%
rem 自動判斷c/c++文件,生成相應參數
if "."=="%Dot%" (
set FileName=%Paramter1:~0,-2%
) else (
set FileName=%Paramter1:~0,-4%
)
rem Android.mk文件中參數
echo LOCAL_PATH := $(call my-dir)> Android.mk
echo include $(CLEAR_VARS)>> Android.mk
echo. >> Android.mk
echo LOCAL_MODULE := %FileName%>> Android.mk
echo |set /p=LOCAL_SRC_FILES :=>> Android.mk
rem 遍歷當前文件夾下所有c/c++源文件
FOR /R  %%i in ( *.c *.cpp ) do (
 echo |set /p= %%~nxi>> Android.mk
)
echo.>> Android.mk
echo include $(BUILD_SHARED_LIBRARY)>> Android.mk
rem Application.mk文件中參數
echo APP_MODULES := %FileName%> Application.mk
echo. >> Application.mk
echo APP_ABI := all >> Application.mk
rem gradle.properties中追加配置
echo.>> %Paramter2%/gradle.properties
echo android.useDeprecatedNdk=true>> %Paramter2%/gradle.properties
rem local.properties中追加配置
echo.>> %Paramter2%/local.properties
rem 注意:D\:\\DevelopKit\\android-ndk-r10e 這個改成自己的NDK所在目錄
echo ndk.dir=D\:\\DevelopKit\\android-ndk-r10e>> %Paramter2%/local.properties

注意:D:\DevelopKit\android-ndk-r10e 這個改成自己的NDK所在目錄,其他的就不用改了
命令使用說明:
javah命令:在包含native方法的類上執行,會生成對應該類的頭文件,如果有多個包含native方法的類,對應執行一次
makefile命令:點擊希望成為模塊的c/c++源文件,以此源文件的文件名為模塊,對應Android.mk中的LOCAL_MODULE和
Application.mk中的APP_MODULES,LOCAL_SRC_FILES後面的參數會根據jni目錄下的c/c++源文件全部羅列上去。
參考下圖理解
這裡寫圖片描述

這裡寫圖片描述

補充這些可以不用配置
Android.mk
自動生成,可以修改其中的配置

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.cpp hello-jni2.cpp
include $(BUILD_SHARED_LIBRARY)

Application.mk
自動生成,可以修改其中的配置

APP_MODULES := hello-jni
APP_ABI := all

local.properties 自動添加固定配置

ndk.dir=你的NDK目錄的絕對路徑

如 D:\DevelopKit\android-ndk-r10e 這是我的NDK目錄

gradle.properties 自動添加固定配置

android.useDeprecatedNdk = true

直接改好上面makefile.cmd(這個文件是用dos命令行編寫的)中對應自己的配置就可以了。是不是又讓你減少點體力?希望如此吧,嘿嘿…
對於我添加的這段補充,有什麼不懂得可以問我,博客的配置流程,我也親自試用了,為大神點贊,特別好用,推薦大家看看哦。
==========這裡原博客沒有,補充結束==========

配置完三個命令之後,你就可以在右鍵菜單中找到這幾個命令,可以直接使用。如下圖演示了生成NdkTest類的頭文件

這裡寫圖片描述
配置工程

讓工程項目使用NDK,需要做一些配置工作
local.properties文件中填寫使用的NDK

ndk.dir=你的NDK目錄的絕對路徑

gradle.properties文件中添加如下代碼

android.useDeprecatedNdk = true

在module的build.gradle添加如下代碼:

android {
   {  ndk
      {
          moduleName "NdkTest"//定義NDKlibrary的名字
          //ldLibs "log" 添加log庫,看自己需求
      }
   }
   //這裡設置目錄,默認就這樣寫就可以了
   sourceSets {
       main {
            jni.srcDir "src/main/jni"
            jniLibs.srcDir "src/main/libs"
       }
   }
}

Hello word
按上面的步驟全都配置完之後就可以在Android Studio上享受NDK了。
下面寫一個簡單的返回Hello word字符串的程序。

首先在java中聲明一個本地方法,並加載本地庫,如下:

public class NdkTest
{
     static {
          System.loadLibrary("NdkTest");
     }
     public static native String getString();
}

生成它的頭文件(自動生成的名字是包名+類名me_majiajie_ndktest_NdkTest.h),並且創建c/c++文件(NdkTest.cpp),如下:

#include "me_majiajie_ndktest_NdkTest.h"
JNIEXPORT jstring JNICALL Java_me_majiajie_ndktest_NdkTest_getString
 (JNIEnv *env, jclass jc)
{
      return env-&gt;NewStringUTF("Hello word !!!");
}

在jni目錄創建一個文件命名為Android.mk,填入以下內容

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := NdkTest
LOCAL_SRC_FILES := NdkTest.cpp
include $(BUILD_SHARED_LIBRARY)

然後在jni目錄創建一個文件命名為Application.mk,填入以下內容

APP_MODULES := NdkTest
APP_ABI := all

注意:Android.mk和Application.mk都是NDK默認的配置文件,關於這兩個文件的詳細介紹可以看官網。
最後生成so包就可以了,記住每次修改C文件都需要重新生成so包:
這裡寫圖片描述

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved