Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android Studio上面使用Ndk JNI 開發工程

Android Studio上面使用Ndk JNI 開發工程

編輯:關於Android編程

Ps:最近比較閒,so.多更新幾篇博客算是總結一下.順便鄙視一下有的programmer照搬網上面文章,並沒有自己去進行相關的實踐驗證.導致網上面的博客千篇一律,只要最初寫博客的人踩坑後面的人全都踩坑.對這類不經過實際檢驗就大抄特抄的人深深的鄙視一下\

ok 接下來我們進入今天的正題,也就是在Android studio裡面如何正確的使用和配置ndk.如果有對jni不了解的童鞋建議先去學習下JNI技術再來看本篇博客.

老規矩,我們先來看看實現的效果:點擊按鈕就會調用c代碼的方法,這裡C代碼的方法會返回一個字符串,我們將這個字符串進行展示.

\

 

准備工作:首先我們來看看進行jni開發都需要哪些東西:Android studio1.51(正式版),android-ndk-r11b程序員一只.准備工作是將將ndk下載下來配置好NDK-HOME(方法和JAVA-HOME配置雷同,故不做贅述,不會自行百度,據說也可以不用配置(⊙﹏⊙)).

下面開始手把手教程\

1.首先使用Android studio創建一個android工程.並且關聯上ndk.這裡關聯的方式有兩種一種是在工程設置裡面進行配置,另外的一種是在工程目錄的local.properties裡面配置ndk的路徑,兩種方式選其中一種即可如下圖所示:

(方案一)

\

(方案2)

\ 2.打開grade.properties文件,在末尾添加:android.useDeprecatedNdk=true.

\

3.然後在模塊的build.gradle文件裡面進行ndk參數的配置.

 

 

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "com.dapeng.ndkdemo"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        ndk {
            moduleName "MyJniLibName"            //生成的so名字(可自己進行指定)
            abiFilters "armeabi", "armeabi-v7a", "x86"    //輸出指定三種abi體系結構下的so庫。目前可有可無(默認是全選的)。
            //ldLibs "log"                                //如果要使用log就把這個加上
        }
    }
    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.3.0'
}

 

4.創建一個類編寫調用c代碼的方法.然後rebuild項目.加載庫的名字就是上面我們在buil.gradle裡面配置的moduleName.調用c代碼的方法必須要用native進行修飾.(這裡需要注意的是不能在裡面寫中文,包括注釋,否則生成頭文件會報錯誤: 編碼GBK的不可映射字符 )

 

public class JniUtils {
    static {
        System.loadLibrary("MyJniLibName");   
    }

    public native String getStringFromC(); 
}
5.待工程build完畢以後,進入到如下圖所示的debug文件夾查看是否生成了我們編寫的類對應的.class文件.目錄如下.

 

\
6. 如果正確的生成了class文件,接下來生成頭文件.打開android studio的terminal(android studio自帶的控制台,在win10上面需要進行設置才能正常的輸入,具體方式問度娘)或者是cmd控制台.使用jdk的生成工具生成頭文件.先cd到我們的模塊的java文件夾下,然後使用javah -jni +調用C代碼的類的全路徑名稱.這裡千萬要看清楚是在哪個路徑下編譯生成的.生成好以後就可以在工程目錄下看到.h格式頭文件.(仔細看我貼出來的路徑,app就是模塊名)

\

\

7.依次點擊工程new-folder-jnifolder生成jni文件夾(也可以自己在java包的同級目錄下直接創建jni文件夾),在jni文件夾裡面創意一個任意名稱且是以.c格式結尾的文件.將剛剛生成的.h頭文件裡面的內容復制到.c文件裡面並且進行編輯.

 

/* DO NOT EDIT THIS FILE - it is machine generated */
#include 
/* Header for class com_dapeng_ndkdemo_JniUtils */

#ifndef _Included_com_dapeng_ndkdemo_JniUtils
#define _Included_com_dapeng_ndkdemo_JniUtils
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_dapeng_ndkdemo_JniUtils
 * Method:    getStringFromC
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_dapeng_ndkdemo_JniUtils_getStringFromC
        (JNIEnv *env, jobject obj) {
    return (*env)->NewStringUTF(env, "hello java from c");
} ;

#ifdef __cplusplus
}
#endif
#endif
8.最後我們通過JniUtils裡面的編寫好的方法來調用c代碼的方法.就可以了.至此所有代碼編寫完畢

 

 

public class MainActivity extends AppCompatActivity {

    private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = (TextView) findViewById(R.id.tv);
        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mTextView.setText(new JniUtils().getStringFromC());
            }
        });
    }
}

 

9.點擊rebuild project ,待工程build完畢以後進入到buil的intermediates文件夾下面看看是否生成了ndk文件夾,接著再看看ndk文件夾裡面是否有.so文件,如果有就說明大工告成了.that is all. plase enjory it.\

\


 

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