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");
}