天天看點

Android Studio 開發之NDK混合開發的應用NDK簡述 NDk之androidstudio 環境配置: 三:編譯代碼:

NDK簡述

Android NDK 是在SDK前面又加上了“原生”二字,即Native Development Kit,是以又被Google稱為“NDK”。

NDK包括了:

  • 從C / C++生成原生代碼庫所需要的工具和build files。
  • 将一緻的原生庫嵌入可以在Android裝置上部署的應用程式封包件(application packages files ,即.apk檔案)中。
  • 支援所有未來Android平台的一系列原生系統頭檔案和庫

為何要用到NDK? 概括來說主要分為以下幾種情況: 1. 代碼的保護,由于apk的java層代碼很容易被反編譯,而C/C++庫被反編譯的難度較大。 2. 在NDK中調用第三方C/C++庫,因為大部分的開源庫都是用C/C++代碼編寫的。 3. 便于移植,用C/C++寫的庫可以友善在其他的嵌入式平台上再次使用。

NDk之androidstudio 環境配置:

  1在gradle.properties裡面聲明使用NDK的代碼

android.useDeprecatedNdk=true
           
Android Studio 開發之NDK混合開發的應用NDK簡述 NDk之androidstudio 環境配置: 三:編譯代碼:

2在工程的local.properties裡面添加NDK的路徑代碼:

ndk.dir=C\:\\Users\\Administrator\\AppData\\Local\\Android\\Sdk\\ndk-bundle
    sdk.dir=C\:\\Users\\Administrator\\AppData\\Local\\Android\\Sdk
           
Android Studio 開發之NDK混合開發的應用NDK簡述 NDk之androidstudio 環境配置: 三:編譯代碼:

3.在app的build.gradle裡面,添加NDK的編譯資訊

Android Studio 開發之NDK混合開發的應用NDK簡述 NDk之androidstudio 環境配置: 三:編譯代碼:
ndk {
            moduleName "myJni"
            abiFilters "armeabi", "arm", "x86"
        }
           
sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
           

三:編譯代碼:

1.編譯Native方法,生成.h檔案:

package com.zzh.hellojni;

/**
 * Created by Administrator on 2017/8/23/023.
 */

public class MyJni {

    public native String getString();
}
           

     2點選Build-->Make Project,生成class檔案

3找到class檔案,在app->build->intermediates->classes->debug目錄下:

Android Studio 開發之NDK混合開發的應用NDK簡述 NDk之androidstudio 環境配置: 三:編譯代碼:

用指令行,到helloJni檔案加下:

Android Studio 開發之NDK混合開發的應用NDK簡述 NDk之androidstudio 環境配置: 三:編譯代碼:
>cd hellojni\build\intermediates\classes\debug

   C:\Users\Administrator\FirstApp\android\hellojni\build\intermediates\classes\debug>javah -jni com.zzh.hellojni.MyJni
           

  會生成一個com_zzh_hellojni_MyJni.h檔案

Android Studio 開發之NDK混合開發的應用NDK簡述 NDk之androidstudio 環境配置: 三:編譯代碼:
内容為:
           
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_zzh_hellojni_MyJni */

#ifndef _Included_com_zzh_hellojni_MyJni
#define _Included_com_zzh_hellojni_MyJni
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_zzh_hellojni_MyJni
 * Method:    getString
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_zzh_hellojni_MyJni_getString
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
           

根據生成.h頭檔案,以及建立的.c或者.cpp檔案,生成.so庫檔案

  ①在app->src->main目錄下建立一個jni檔案夾,用來存c/c++的頭檔案以及源檔案,将剛剛生成.h頭檔案剪切到這裡來,然後建立一個.c

#include "edan_com_as_ndk_demo_ndktest_NdkJniUtils.h"
/*
 * Class:     com_example_edu_ndktest_NdkJniUtils
 * Method:    getCLanguageString
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL JNICALL Java_com_zzh_hellojni_MyJni_getString
  (JNIEnv *env, jobject obj){
     return (*env)->NewStringUTF(env,"Hi Jni!");
  }
           

這樣準備工作就完成了然後 點選Build->Make Project進行編譯,生成.so庫檔案,路徑:app->build->intermediates->ndk->debug->lib下:

如果執行失敗。你可以把剛剛生成的Mk檔案copy到jni檔案夾下,然後使用指令行執行:

然後指令行到次檔案加下:

如下
C:\Users\Administrator\FirstApp\android\hellojni\src\main\jni> ndk-build
           
Android Studio 開發之NDK混合開發的應用NDK簡述 NDk之androidstudio 環境配置: 三:編譯代碼:

然後把生成的SO檔案copy到libs下面就可以了

這樣一個完整NDk開發流程就走完了

繼續閱讀