JNI-NDK 在AndroidStudio3.2.1版本集成方法(ndk-build方式)

集成方法

  1. 在java類裏寫個native方法html

    public class Java2CJNI {
            public  native String java2C();
        }
    複製代碼
  2. javah 生成jni樣式的標準頭文件java

    切換到src/main/java目錄下執行android

    javah -d ../jni ndkold.study.com.ndkolddemo.Java2CJNI
    複製代碼

    -d ../jni 指定輸出路徑爲:當前目錄的父目錄下的jni目錄 ndkold.study.com.ndkolddemo.Java2CJNI這是包含native方法的那個類c++

3.執行完後生成了jni目錄及頭文件git

這個就是java與native方法進行交互的接口github

  1. 建立實現頭文件的.cpp源文件 接下來要寫個c++代碼,實現這個jni接口

˙注意這裏新建的是c++代碼,c++代碼對應下面的代碼bash

//引入剛纔生成的頭文件
#include "ndkold_study_com_ndkolddemo_Java2CJNI.h"

//複製頭文件裏的要實現的方法名及其參數
JNIEXPORT jstring JNICALL
Java_ndkold_study_com_ndkolddemo_Java2CJNI_java2C(JNIEnv *env, jobject instance) {
//    實現這個方法,返回一個字符串
    return env->NewStringUTF("Hello from C++");
}
複製代碼

你也能夠寫個.c源文件,其對應代碼爲app

//引入剛纔生成的頭文件
#include "ndkold_study_com_ndkolddemo_Java2CJNI.h"

//複製頭文件裏的要實現的方法名及其參數
JNIEXPORT jstring JNICALL
Java_ndkold_study_com_ndkolddemo_Java2CJNI_java2C(JNIEnv *env, jobject instance) {
//    實現這個方法,返回一個字符串
    return (*env)->NewStringUTF(env, "Hello from C");
    //注意這裏是(*env),並且須要傳遞一個參數(env)
}
複製代碼

首次接觸jni可忽略下面的解釋,知道怎麼用就行,之後再慢慢研究ide

說明:c與c++就這點區別,查看jni.h文件,發如今c裏的JNIEnv是結構體指針JNINativeInterface*的別名,因此JNIEnv *env至關於二級指針,如今要調用JNINativeInterface*裏的方法,要用(*env)->xxxui

在c++裏JNIEnv是_JNIEnv的別名,在_JNIEnv內部裏有個屬性爲結構體指針JNINativeInterface*,而後他把全部c裏的方法都從新定義了一下,定義方式就是經過JNINativeInterface*調了一遍全部c裏的方法,並且把JNINativeInterface*的對象以this方式傳遞進去了,可見這裏的JNIEnv *env是一個一級指針,因此經過env就能夠直接調用對應的方法了(有點繞)

  1. rebuild project 報錯
FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:compileDebugNdk'.
> Error: Your project contains C++ files but it is not using a supported native build system.
  Consider using CMake or ndk-build integration. For more information, go to:
   https://d.android.com/r/studio-ui/add-native-code.html
  Alternatively, you can use the experimental plugin:
   https://developer.android.com/r/tools/experimental-plugin.html

複製代碼

在AndroidStudio3.2.1版本如下,是其餘處理方式,見下文 如何解決Your project contains C++ files but it is not using a supported native build system, 可是我用的是3.2.1版本,按照上述處理仍是不行的,要參考這篇文章android Studio(3.2.1) NDK配置

  1. rebuild報錯後,複製Android.mk文件

找到Android.mk文件,在build/intermediates/ndk/目錄裏

複製到這裏,jni/

  1. moudle.gralde文件配置
defaultConfig {
        ...
        ndk {
            moduleName "Java2C"
            //so文件名,若是這裏配置了so文件名字,
            //記得更改Android.mk裏的LOCAL_MODULE :字段爲 LOCAL_MODULE := Java2C
            abiFilters "armeabi", "armeabi-v7a", "x86" //指定so文件所支持的CPU類型,若是不寫的話,會生成全部的CPU類型的so文件
        }
    }
複製代碼
android {
    ...
     externalNativeBuild {
            ndkBuild {
                path "src/main/jni/Android.mk"//指定Android.mk路徑
            }
        }
    }
複製代碼
  1. 再次rebuild

至今生成了libJava2C.so文件

9.調用native方法

public class Java2CJNI {
//    先加載so文件,注意這裏的libname是Java2C,不是 libJava2C.so
//    這個libname是Android.mk裏的 LOCAL_MODULE := Java2C 字段控制的,注意必定要一致的
    static {
        System.loadLibrary("Java2C");
    }

    public native String java2C();
}
複製代碼

至此,java經過jni調用C++ 成功了

  1. 注意

若是你沒成功,極可能是這幾處不一致

github demo下載

參考

  1. Android NDK開發之從環境搭建到Demo級十步流

    這篇文章在AndroidStudio版本3.2.1上不適用,適用於更早期的版本

  2. android Studio(3.2.1) NDK配置

    這篇文章適用於AndroidStudio版本3.2.1以上

  3. 官方文檔

  4. 慕課網視頻-Android-NDK入門(Eclipse)

  5. 慕課網視頻-Android-NDK進階(AndroidStudio)

  6. 簡書- JNI從入門到放棄(很好的文章)

相關文章
相關標籤/搜索