在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Android/ Android Studio的NDK開發(fā)
多分辨率適配常用目錄
Android 開發(fā)環(huán)境(Eclipse+ADT+Android 5.0)
Android 原型設(shè)計工具探索
Makefile 快速入門
Android Studio的NDK開發(fā)
人臉檢測-靜態(tài)
getprop 與 dumpsys 命令
Maven 編譯開源二維碼掃描項目 zxing
畫布 Canvas
組合控件
Linux 下的模擬器硬件加速
讀取 Excel
android.hardware.camera2 使用指南
橫豎屏切換
Ubuntu 下切換 JDK 版本
拍照和錄像 with Camera
文本與布局
按鈕控制 ViewPager 的左右翻頁
用 TableLayout 偽裝表格顯示數(shù)據(jù)
Preference Activity 使用詳解
模擬器如何重啟?試試 Genymotion!
獲得屏幕物理尺寸、密度及分辨率
語音識別
了解 native activity
Android Studio 導(dǎo)入第三方類庫、jar 包和 so 庫
啟動另一個 App/apk 中的 Activity
APK 簽名
兩個開源的圖表/報表控件
android studio 導(dǎo)出 jar 包(Module)并獲得手機(jī)信息
圖片的 Base64 編解碼
混淆與反編譯
Android Studio 和 Gradle
Android 5.1 SDK 下載與配置
persistableMode 與 Activity 的持久化
adb 取出安裝在手機(jī)中的 apk
Android Studio 中的源代碼管理
Handler 使用中可能引發(fā)的內(nèi)存泄漏

Android Studio的NDK開發(fā)

目錄(?)[+]

較新的 NDK 版本是 r10b,Android Studio 對 NDK 開發(fā)的支持還處于構(gòu)思階段,所以很多工作比如用 Javah 生成頭文件等工作還要自己做。今天用一個例子來演示 AS 中的 NDK 開發(fā)。

新建一個項目 SecondNdkTest

在此項目中新建一個 Module 叫 ndklibrary,作為 so 庫單獨(dú)劃出來。在 library 中新建一個 Java 類 SecondLib,內(nèi)容如下:

    package com.linc.ndklibrary;

    /**
     * Created by linc on 15-3-29.
     */
    public class SecondLib {
        // Native implementation  
        static {  
        System.loadLibrary("SecondLib"); 
        } 
        //int array
        public static native int[] intMethod();
        //string array
        public static native String[] stringMethod();
    }

Build—>Make Module’ndklibrary’,這樣 SecondLib 就編譯完成了,通過 SecondLib.class,用 Javah 生成 C 的頭文件,如下:

    AndroidStudioProjects/SecondNdkTest/ndklibrary/src/main$ javah -d jni -classpath ../../build/intermediates/classes/debug com.linc.ndklibrary.SecondLib
    AndroidStudioProjects/SecondNdkTest/ndklibrary/src/main$ ls
    AndroidManifest.xml  java  jni  res
    AndroidStudioProjects/SecondNdkTest/ndklibrary/src/main$ ls jni/
    com_linc_ndklibrary_SecondLib.h

頭文件內(nèi)容如下:

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class com_linc_ndklibrary_SecondLib */

    #ifndef _Included_com_linc_ndklibrary_SecondLib
    #define _Included_com_linc_ndklibrary_SecondLib
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class: com_linc_ndklibrary_SecondLib
     * Method:intMethod
     * Signature: ()[I
     */
    JNIEXPORT jintArray JNICALL Java_com_linc_ndklibrary_SecondLib_intMethod
      (JNIEnv *, jclass);

    /*
     * Class: com_linc_ndklibrary_SecondLib
     * Method:stringMethod
     * Signature: ()[Ljava/lang/String;
     */
    JNIEXPORT jobjectArray JNICALL Java_com_linc_ndklibrary_SecondLib_stringMethod
      (JNIEnv *, jclass);

    #ifdef __cplusplus
    }
    #endif
    #endif

Native 代碼實(shí)現(xiàn)

在 jni 目錄中新建 c 文件 SecondLib.c 與頭文件對應(yīng),分別實(shí)現(xiàn)上述兩個方法,內(nèi)容如下:

    #include "com_linc_ndklibrary_SecondLib.h"

     const static int length=10;

     //int array
     JNIEXPORT jintArray JNICALL Java_com_linc_ndklibrary_SecondLib_intMethod
       (JNIEnv *env, jclass obj)
     {
        jintArray array;
        array=(*env)->NewIntArray(env,10);
        int i=1;
        for(;i<=10;++i)
        {
            (*env)->SetIntArrayRegion(env,array,i-1,1,&i);
        }

        //get array length
        int len=(*env)->GetArrayLength(env,array);

        //array content
        jint* elems=(*env)->GetIntArrayElements(env,array,0);

        return array;
     } 

     //string array
     JNIEXPORT jobjectArray JNICALL Java_com_linc_ndklibrary_SecondLib_stringMethod
       (JNIEnv *env, jclass obj)
     {
        jclass class=(*env)->FindClass(env,"java/lang/String");
        jobjectArray string=(*env)->NewObjectArray(env,(jsize)  length,
                class,0);
        jstring jstr;
        char* _char[]={"my ","name ","is ",
                    "linc!!","正在","學(xué)習(xí)",
                        "JNI","和","NDK","技術(shù)!"
                        };
        int i=0;
        for(;i<length;++i)
        {
            jstr=(*env)->NewStringUTF(env,_char[i]);
            (*env)->SetObjectArrayElement(env,string,i,jstr);
        }

         return string;
    }

編譯

在 local.properties 中加入 ndk路徑:

    ndk.dir=/opt/ndk/android-ndk-r10b

然后在 ndklibrary 的 build.gradle 中 defaultConfig 中加入 ndk 定義,如下:

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
        ndk{
            moduleName "SecondLib"
        }
    }

這樣就可以直接編譯了,不用自己編寫 make 文件了。

Build—>Make Module’ndklibrary’,生成的 so 如下:

    AndroidStudioProjects/SecondNdkTest$ find -name *.so
    ./ndklibrary/build/intermediates/ndk/debug/lib/armeabi/libSecondLib.so
    ./ndklibrary/build/intermediates/ndk/debug/lib/armeabi-v7a/libSecondLib.so
    ./ndklibrary/build/intermediates/ndk/debug/lib/mips/libSecondLib.so
    ./ndklibrary/build/intermediates/ndk/debug/lib/x86/libSecondLib.so
    ./ndklibrary/build/intermediates/ndk/debug/obj/local/armeabi/libSecondLib.so
    ./ndklibrary/build/intermediates/ndk/debug/obj/local/armeabi-v7a/libSecondLib.so
    ./ndklibrary/build/intermediates/ndk/debug/obj/local/mips/libSecondLib.so
    ./ndklibrary/build/intermediates/ndk/debug/obj/local/x86/libSecondLib.so

注:

至于直接在 Activity 中用 native 的方法請參考下面的前兩個鏈接。我遇到了問題沒有得到解決:

    $ javah -d jni -classpath /opt/sdk/platforms/android-5.1/android.jar;../../build/intermediates/classes/debug   com.linc.secondndktest.MainActivity
    Error: no classes specified
    bash: ../../build/intermediates/classes/debug/: Is a directory