[Android開發]Mac下NDK開發(JNI)

陶程發表於2016-03-12

Mac下Android呼叫C/C++程式的實現(JNI)


IDE用的是Androidstudio。

首先,我們需要配置Mac下的NDK環境,比較簡單,參考部落格:

Mac下Android studio 之NDK配置教程(一)
Mac下Android studio 之NDK配置教程(二)

好,接下來我們就開始寫我們在Mac下的第一個NDK程式。

第一步:首先,新建一個專案,專案截圖如下:

這裡寫圖片描述

在NavHelper中定義JNI的介面:

public static native String getTextStringFromNativate();
public native String print(String msg);

第二步:生成JNI相關檔案

記住,寫好程式碼後記得Build->Rebuild Project。

localhost:~ dream$ cd /workspace/NDKDemo/app/src/main 

注意workspace是你自己的路徑,接下來採用javah來生成C標頭檔案

localhost:main dream$ javah -d jni -classpath ../../build/intermediates/classes/debug/ -jni com.geniusvjr.ndkdemo.NavHelper

執行完成後,回到Android Studio下面,你會發現在main的同級目錄下,生成了一個叫jni的資料夾,並生成了檔案:

com_geniusvjr_ndkdemo_NavHelper.h

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

#ifndef _Included_com_geniusvjr_ndkdemo_NavHelper
#define _Included_com_geniusvjr_ndkdemo_NavHelper
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_geniusvjr_ndkdemo_NavHelper
 * Method:    getTextStringFromNativate
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_geniusvjr_ndkdemo_NavHelper_getTextStringFromNativate
  (JNIEnv *, jobject);

/*
 * Class:     com_geniusvjr_ndkdemo_NavHelper
 * Method:    print
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_geniusvjr_ndkdemo_NavHelper_print
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

接下來自己新建一個c檔案:main.c來實現介面中的方法:

//
// Created by 陶程 on 16/3/12.
//

#include "com_geniusvjr_ndkdemo_NavHelper.h"

JNIEXPORT jstring JNICALL Java_com_geniusvjr_ndkdemo_NavHelper_getTextStringFromNativate
        (JNIEnv * env, jobject object){
    return (*env)->NewStringUTF(env,"這是C語言程式");

}

JNIEXPORT jstring JNICALL Java_com_geniusvjr_ndkdemo_NavHelper_print
        (JNIEnv * env, jobject object, jstring str){
    return (*env)->NewStringUTF(env,"Java_dzq_ndk_NavHelper_print");
}

第三步:編譯——執行

首先配置好Android Studio的NDK路徑,開啟專案根目錄下 local.properties 檔案,追加ndk.dir(NDK的路徑)

ndk.dir=//Users/dream/Documents/bin/android-ndk-r10e 

然後在app目錄下的 build.gradle中設定需要生成的庫檔名(生成的so檔名):

ndk
    {
       moduleName "Jni"  //設定庫(so)檔名稱
    }

Tips:將這段程式碼加在defaultConfig 這項裡面

在NavHelper類中載入:

static {  
    System.loadLibrary("Jni");  
}

最後一步的配置,開啟專案根目錄下面的:gradle.properties 加上以下程式碼

android.useDeprecatedNdk=true

我們在MainActivity裡面寫一些顯示的程式碼:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView tv = new TextView(this);
        String says = NavHelper.getTextStringFromNativate();
        tv.setText(says);
        setContentView(tv);
    }
}

模擬器中顯示如下:

這裡寫圖片描述

至此,NDK的第一個程式開發完畢。

相關文章