NDK開發簡單demo

固然事前必定要先配好環境;java

下面來講步驟:android

    1. 在代碼裏寫入要調用的native方法:app

String getData();

String getData2();

    2. 動態連接庫;ide

            System.loadLibrary("ndktest")gradle

    3. 在build.gradle文件中 加入ndk{...}代碼:ui

defaultConfig {
    applicationId "com.hong.ndktest"
    minSdkVersion 19
    targetSdkVersion 23
    versionCode 1
    versionName "1.0"
    
    ndk{
            moduleName "ndktest"
            abiFilters "armeabi", "armeabi-v7a", "x86"
            }
}

    4. 在main目錄下建立 jni 文件夾;spa

    5. 在jni 文件夾裏面建立 .c 文件:.net

            

    6. 用javah生成c的頭文件
         a,控制檯先進入工程的目錄下    項目路徑\AndroidStudioProjects\NDKDemo\ndkdemo2\src\main>
         b,執行下面命令:
           javah -d jni -classpath D:\AndroidStudio\sdk\platforms\android-23\android.jar;..\..\build\intermediates\classes\debug yourPackageName.MainActivity
debug

    (註釋: 紅字 23 這裏要根據你build.gradle文件中的 tartgetSdkVersion 更改);code

        當回車以後沒有反應 就成功了,在jni文件夾裏能夠看到生成的頭文件(在第5步的圖片中" com_hong_ndktest_MainActivity.h" 即是生成的頭文件)

        

        7. 生成頭文件成功後,會在  build\intermediates\ndk\debug 中生成 .mk 文件。打開頭文件,裏面有 對應的 native 方法(方法簽名都省了):

    

/*
 * Class:     com_hong_ndktest_MainActivity
 * Method:    getData
 * Signature: ()Ljava/lang/String;
 */

JNIEXPORT jstring JNICALL Java_com_hong_ndktest_MainActivity_getData
  (JNIEnv *, jobject);
/*
 * Class:     com_hong_ndktest_MainActivity
 * Method:    getData2
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_hong_ndktest_MainActivity_getData2
  (JNIEnv *, jobject);

   


8.  把對應的方法黏貼到 .c 文件中,並填寫邏輯代碼,不要忘了把include<>也黏貼過去:

//
// Created by Hong on 2016/3/30.
//
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_hong_ndktest_MainActivity */

#define _Included_com_hong_ndktest_MainActivity
/*
 * Class:     com_hong_ndktest_MainActivity
 * Method:    getData
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_hong_ndktest_MainActivity_getData
        (JNIEnv * env, jobject jobj) {
        return (*env)->NewStringUTF(env, "from C");
}

/*
 * Class:     com_hong_ndktest_MainActivity
 * Method:    getData2
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_hong_ndktest_MainActivity_getData2
        (JNIEnv *env, jobject jobj) {
        return (*env)->NewStringUTF(env, "fromCgetData2");
}

                   

9. 在 java 端能夠調用 c 了;

    ==================================分割線就是我可恨=======================

下面粘貼源碼:

    MainActivity;

package com.hong.ndktest;

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

public class MainActivity extends Activity {
    TextView tv_show;
    {
        System.loadLibrary("ndktest");//加載庫
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv_show = (TextView) findViewById(R.id.tv_show);
    }

    /*
     * button 點擊事件
     */
    public void show(View view) {
        String data = getData()+"===="+getData2();//調用native方法
        tv_show.setText(data);
    }

    //聲明native方法
    public native String getData();
    public native String getData2();

}


TestJNI.c

#include <jni.h>

#define _Included_com_hong_ndktest_MainActivity
/*
 * Class:     com_hong_ndktest_MainActivity
 * Method:    getData
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_hong_ndktest_MainActivity_getData
        (JNIEnv * env, jobject jobj) {
        return (*env)->NewStringUTF(env, "from C");
}

/*
 * Class:     com_hong_ndktest_MainActivity
 * Method:    getData2
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_hong_ndktest_MainActivity_getData2
        (JNIEnv *env, jobject jobj) {
        return (*env)->NewStringUTF(env, "fromCgetData2");
}


效果:

    

點擊button後:

    


最後說一句:若是項目報錯的話 在 gradle.properties 文件中最後一行添加以下語句:

android.useDeprecatedNdk=true

demo下載地址: http://download.csdn.net/download/qq_33363534/9477065

相關文章
相關標籤/搜索