android studio ndk 開發以及問題

1,環境準備下載的ndk

2,android studio 配置ndk

第一種方式配置

local.properties
sdk.dir=D\:\\installtool\\sdk\\sdk
ndk.dir=D\:\\tools\\android\\android-ndk-r10d-windows\\android-ndk-r10d

第二種方式配置

快捷鍵F4  彈出項目結構對話框,選擇ndk目錄

這裏寫圖片描述

3,在項目的src/main創建jni目錄
這裏寫圖片描述

jni 目錄裏面創建Android.mk和後面這個文件不要Application.mk也是可以

Android.mk 裏面有需要編譯的c/c++源文件,模塊的名字要正確,這裏的模塊名字就是在java。loadLibrary時候需要的

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JniTest
LOCAL_SRC_FILES := math.cpp
include $(BUILD_SHARED_LIBRARY) //表明是動態庫

配置項目裏的build.gradle

這裏寫圖片描述

關鍵的有ndk和sourceSets 設置jni加載文件目錄

ndk 是在defaultConfig 裏面配置
moduleName第一個模塊名字
ldLibs 在jni裏面打印android log 日誌
abiFilters 編譯生成的平臺類型

這裏配置了,所以在Android.mk裏面就不用配置加載日誌,還有Application.mk 配置編譯生成平臺,如果配置了,build.gradle 的優先級也是最高的

4,創建jni的java的類

這裏有2個native 方法,通過靜態塊加載動態so文件

package com.framework.ui.activity;

public class MathJNI {
    static {
        System.loadLibrary("JniTest");
    }

    public native String get();

    public native void set(String name);
}

5,通過javah 生成c/c++的頭部文件

javah在jdk的bin目錄下面

這裏寫圖片描述

這裏的目錄只能到debug下面,如果在其他目錄會生成頭文件失敗
這裏寫圖片描述
生成的頭文件
com_framework_ui_activity_MathJNI.h 包名+類名

第二種方式
在app/src/main/java 通過命令生成 目錄也只能到這裏 ,目錄在包裏面就不行了
這裏寫圖片描述

頭文件生成了,就是爲了實現頭文件的方法,相當與java裏面額接口定義了,要實現接口

6,在jni創建.c/.cpp文件名字隨便

生成的頭部文件

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

#ifndef _Included_com_framework_ui_activity_MathJNI
#define _Included_com_framework_ui_activity_MathJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_framework_ui_activity_MathJNI
 * Method:    get
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_framework_ui_activity_MathJNI_get
  (JNIEnv *, jobject);

/*
 * Class:     com_framework_ui_activity_MathJNI
 * Method:    set
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_com_framework_ui_activity_MathJNI_set
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

把生成的頭部文件內容複製到,.c/.cpp的文件裏面

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
#include <stdio.h> //導入文件
/* Header for class com_framework_ui_activity_MathJNI */
#include <android/log.h>//導入android日

#define TAG "my-jni" // 這個是自定義的LOG的標識
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG ,__VA_ARGS__) // 定義LOGD類型
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,TAG ,__VA_ARGS__) // 定義LOGI類型
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,TAG ,__VA_ARGS__) // 定義LOGW類型
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,TAG ,__VA_ARGS__) // 定義LOGE類型
#define LOGF(...) __android_log_print(ANDROID_LOG_FATAL,TAG ,__VA_ARGS__) // 定義LOGF類型

#ifndef _Included_com_framework_ui_activity_MathJNI
#define _Included_com_framework_ui_activity_MathJNI

#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_framework_ui_activity_MathJNI
 * Method:    get
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_framework_ui_activity_MathJNI_get
        (JNIEnv *env, jobject jObj){
    return env->NewStringUTF("Hello From JNI!");
}

/*
 * Class:     com_framework_ui_activity_MathJNI
 * Method:    set
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_com_framework_ui_activity_MathJNI_set
(JNIEnv *env, jobject jObj, jstring jstr) {
    char *str = (char*)env->GetStringUTFChars(jstr,NULL);
    LOGD("########## i = %s", str);
}

#ifdef __cplusplus
}
#endif
#endif

拷貝過來的時候需要修改的 方法加上{}括號,把參數改了正確,應爲頭部裏面的定義的方法只有類型,沒有類型的名字,在實現裏面全部不全。

android 運行調用的結果

   @Override
    protected void initViewAndEvent() {
        TLog.d(TAG_LOG, new MathJNI().get());
        new MathJNI().set("test");
    }
07-05 05:07:16.126 17678-17678/com.framework D/com.framework.ui.activity.FirstActivity: FirstActivity.java (31) initViewAndEvent: Hello From JNI!
07-05 05:07:16.126 17678-17678/com.framework D/my-jni: ########## i = test

在windows 上面會出現這個錯誤

Error:Execution failed for task ‘:app:compileDebugNdk’.

通過在jni目錄創建一個空的utils.c或者utils.cpp都可以,編譯就能通過了

jni的java對應的數據類型表 圖來自android開發藝術探索

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章