Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android Studio下NDK的使用

Android Studio下NDK的使用

編輯:關於android開發

Android Studio下NDK的使用


當我們在開發android程序的過程中,有時候需要應用程序對底層硬件的調用。android官方給我們提供NDK以便於我們在我們的程序中調用C,C++庫。
Ndk是基於JAVA JNI技術所開發的一套應用於android編程的一系列工具集合,她可以幫助我們快速開發C或者C++的動態庫並和應用一起打包生成APK。

關於JNI的原理,請參考 [ JAVA基礎之理解JNI原理]


NDK的下載與安裝

前往前往http://developer.android.com/ndk/downloads/index.html。

或者國內諸多鏡像網站

下載完成後直接解壓後即可使用


NDK的在Android Studio中的使用

1、新建一個Android Studio工程
創建一個android studio工程

2、配置工程中NDK的路徑
file->project structure
這裡寫圖片描述

點擊確定後,你的local.prZ喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcGVydGllc87EvP7PwsPmtuDBy9K70NBuZGu1xMK3vrY8L3A+DQo8cD48aW1nIGFsdD0="這裡寫圖片描述" src="http://www.bkjia.com/uploads/allimg/160412/0411155916-2.png" title="\" />

3、新建一個NDKTest類並編寫如下代碼
這裡寫圖片描述

public class NDKTest {
    static {
        System.loadLibrary("ndk_test");
    }

    public native static String hello();
}

4、rebuild一下項目後,將工程求換到project目錄
這裡寫圖片描述

bebug目錄下面已經生成了剛才編寫的NDKTest文件的.class文件
這裡寫圖片描述

然後我們通過terminal進入到這個目錄下面
這裡寫圖片描述

使用javah生成c.h頭文件
javah -jni com.hehao.ndkdemo.ndk.NDKTest

執行完成後將生成com_hehao_ndkdemo_ndk_NDKTest.h的一個C文件
這裡寫圖片描述

接下來在main目錄下面。新建一個jni目錄
這裡寫圖片描述
這裡寫圖片描述

把我們之前用javah生成的.h頭文件拷貝或者剪切到jni目錄中去
這裡寫圖片描述

創建一個C文件來實現頭頭文件中聲明的函數(名字隨意)但是通常我們會使用java+包名+類名這樣的名字
並在文件中添加如下代碼

#include "com_hehao_ndkdemo_ndk_NDKTest.h"
/*
* Class:     Java_com_hehao_ndkdemo_ndk_Test
* Method:    test
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_hehao_ndkdemo_ndk_NDKTest_hello
        (JNIEnv *env, jobject obj)
{
    return env->NewStringUTF("這裡是來自c的:hello world!");
}

這裡寫圖片描述

然後我們使用剛才的rebuild操作再重新構建一下項目 Build->Rebuild Project

PS:然後我發現項目報錯了
這裡寫圖片描述
不知道為什麼,重啟一下AS後重新Rebuild一下,搞定

然後在運行的時候又提示了這個錯誤
這裡寫圖片描述
按照他說的我們去gradle.properties的末尾添加一行代碼

android.useDeprecatedNdk=true

這裡寫圖片描述

再來 又報錯了
這裡寫圖片描述
這個錯誤百度了很多資料,據說是NDK在windows下面的一個bug。我也沒有考證,引用別人的說法。
解決辦發是在jni目錄下創建一個空的c文件
這裡寫圖片描述

再來,終於運行成功了。然後我們在mainActivity中嘗試調用一下NDK類的代碼

package com.hehao.ndkdemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

import com.hehao.ndkdemo.ndk.NDKTest;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView textView = (TextView) findViewById(R.id.ndk_test);
        textView.setText(NDKTest.hello());
    }
}

然後發現出錯了
這裡寫圖片描述
一定位,發現加載類的時候出問題了
這裡寫圖片描述

這時,需要在App模塊的gradle文件中添加

ndk {
            moduleName "ndk_test"          //生成的so名字
            abiFilters "armeabi", "armeabi-v7a", "x86" //輸出指定三種abi體系結構下的so庫,目前可有可無
}

這裡寫圖片描述
生成的.so文件要和我們在之前創建的Java文件中引入的保持一致

成功

這裡寫圖片描述

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