android NDK的配置,JNI的使用及demo

demo下載地址:

https://download.csdn.net/download/u010672559/10592633

一、NDK的配置
1.下載SDK Tools裏面的LLDB和NDK
 

 
 
2.配置NDK路徑

3.配置NDK環境變量,系統環境變量裏面創建NDK_ROOT內容爲SDK裏面的ndk-bundle路徑,然後Path後面追加;%NDK_ROOT%
NDK_ROOT
D:\yxzWork\soft\android\sdk_as\ndk-bundle
Path
;%NDK_ROOT%
之後cmd內輸入ndk-bundle,如果出現以下提示,則表示配置成功
 

======================================================================

二、JNI的使用及demo

概述:先介紹JNI使用的步驟,具體的文件源碼在後面有貼出

1.先新建JNITest.java文件,然後可以通過命令javah -jni -encoding utf-8 包名+類名,生成相應的.h文件,此處如果提示javah不是內容文件可能是jdk配置有問題,我之前有碰到的問題就是jdk安裝的64位,但是jdk配置是按網上的32位配的,所以不行,後面改成32位的jdk了
D:\yxzWork\workspace\asworkspace\JniTest\app\src\main\java>javah -jni -encoding utf-8 com.android.yxz.jnitest.JNITest

2.創建test.c文件,然後可以參考JNITest.h的包名類名做修改,然後添加mk文件,注意jni文件的路徑不是在app下面,而是在src/main下面

3.配置工程相關配置項
在 build.gradle 文件夾的 android 下添加(buildTypes下面,不是裏面):
sourceSets {
    main() {
        jniLibs.srcDirs = ['src/main/libs']
        jni.srcDirs = [] //屏蔽掉默認的jni編譯生成過程
    }
}
D:\yxzWork\workspace\asworkspace\JniTest\gradle.properties下添加
android.useDeprecatedNdk=true
4.在jni的路徑下執行ndk-build,然後會生成相應的so文件
D:\yxzWork\workspace\asworkspace\JniTest\app\src\main\jni>ndk-build

 

5.之後直接運行apk即可

6.c中加log的方法

#define LOGI(fmt, args...) __android_log_print(ANDROID_LOG_INFO,  TAG, fmt, ##args)  
#define LOGD(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, TAG, fmt, ##args)  
#define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, TAG, fmt, ##args)

int類型
 LOGD("your-tag-str(value = %d)", value); 
String類型
  LOGD("your-tag-str(strValue = %s)", strValue)

%d整型輸出,%ld長整型輸出,
%o以八進制數形式輸出整數,
%x以十六進制數形式輸出整數,或輸出字符串的地址。
%u以十進制數輸出unsigned型數據(無符號數)。注意:%d與%u有無符號的數值範圍,也就是極限的值,不然數值打印出來會有誤。
%c用來輸出一個字符,
%s用來輸出一個字符串,
%f用來輸出實數,以小數形式輸出,默認情況下保留小數點6位。
%.100f用來輸出實數,保留小數點100位。
%e以指數形式輸出實數,
%g根據大小自動選f格式或e格式,且不輸出無意義的零。

=================

代碼(注意不同項目c文件的包名類名需做相應更改)

---------

JNITest
public class JNITest {
    // 動態導入 so 庫
    static {
        System.loadLibrary("JNITest");
    }

    public native static String get();
}

-------------

MainActivity
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {
    public static final String TAG = "xiaozheng";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(TAG, "JNITest.get()="+JNITest.get());
    }
}

----------

Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := JNITest
LOCAL_SRC_FILES := test.c
include $(BUILD_SHARED_LIBRARY)

--------------

Application.mk

APP_ABI := all

-----------

com_android_yxz_jnitest_JNITest.h

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

#ifndef _Included_com_android_yxz_jnitest_JNITest
#define _Included_com_android_yxz_jnitest_JNITest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_android_yxz_jnitest_JNITest
 * Method:    get
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_android_yxz_jnitest_JNITest_get
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

-------

test.c

#include<jni.h>
#include<stdio.h>
//導入我們創建的頭文件
#include "com_android_yxz_jnitest_JNITest.h"

JNIEXPORT jstring JNICALL Java_com_android_yxz_jnitest_JNITest_get
  (JNIEnv *env, jclass jclass){
      //返回一個字符串
      return (*env)->NewStringUTF(env,"print Java_com_android_yxz_jnitest_JNITest_get");
  }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章