android JNI “ hello world”

使用 android studio進(jìn)行開(kāi)發(fā)。 編譯環(huán)境是 Android.mk.

首先,新建一個(gè) android project 也不用 勾選 C++的選項(xiàng),因?yàn)槲疫@里不使用 CMake

    首先 簡(jiǎn)單配置一下 Android.mk 和 Application.mk 這兩個(gè)文件 簡(jiǎn)歷在main 目錄下面的 jni 文件夾中。
    同時(shí) .cpp 文件也放在這個(gè)文件夾里面。

  在build.gradle 中配置 簡(jiǎn)單的 NDK 信息。
        defaultConfig {
    applicationId ""
    minSdkVersion 21
    targetSdkVersion 26
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    ndk{
        moduleName "hello-test"
        abiFilters "armeabi-v7a"
    }
}

android 標(biāo)簽下添加

    sourceSets.main {
          //  jniLibs.srcDirs = ['src/main/jniLibs','libs']
          jniLibs.srcDirs = ["src/main/libs"]  //指向要使用的庫(kù)文件//的路徑,前邊的是自己項(xiàng)目的,后邊的是第三方的so
          jni.srcDirs=[]  //禁止gradle 自動(dòng)編譯,使用已經(jīng)編譯好的So庫(kù)
    }

放在android標(biāo)簽外面

  task ndkBuild(type: Exec) {
    commandLine '/Users/bushetianzhen/Library/Android/sdk/ndk-bundle/ndk-build', '-C', file('src/main/jni').absolutePath
  }

  tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn ndkBuild
  }

Android.mk 中的配置 —— 詳細(xì)說(shuō)明自行g(shù)oogle

      LOCAL_PATH := $(call my-dir)
      include $(CLEAR_VARS)
      LOCAL_MODULE    := hello-test
      LOCAL_SRC_FILES := helloTest.cpp
      include $(BUILD_SHARED_LIBRARY)

Application.mk 中的配置—— 詳細(xì)說(shuō)明請(qǐng)看官方文檔

      APP_OPTIM := release
      APP_PLATFORM := android-9
      APP_ABI := armeabi-v7a  //APP_ABI := all代表生成所有平臺(tái)的庫(kù)文件
      APP_STL := gnustl_static
      APP_CPPFLAGS :=-O3 -std=c++11 -frtti -fexceptions

java 中的code

      static {
              ystem.loadLibrary("hello-test");
       }

       public static native String helloJni();

對(duì)應(yīng)的 C++ code ,C++與C 是用區(qū)別的

    #include <string.h>
    #include <jni.h>
    extern "C" {  // 聲明編譯環(huán)境是 C
          // 聲明JNI 的方法
          JNIEXPORT jstring JNICALL Java_com_dressplus_androidndk_ndkUtils_HelloTest_helloJni(JNIEnv* env, jobject obj);
      };

      jstring Java_com_dressplus_androidndk_ndkUtils_HelloTest_helloJni(JNIEnv* env, jobject obj)
 {
return env->NewStringUTF("Hello from JNI !  Compiled with ABI .");
 }

    每個(gè)native函數(shù),都至少有兩個(gè)參數(shù)(JNIEnv*,jclass或者jobject)。

        1)當(dāng)native方法為靜態(tài)方法時(shí):
                  jclass 代表native方法所屬類(lèi)的class對(duì)象(JniTest.class)。
        2)當(dāng)native方法為非靜態(tài)方法時(shí):
                jobject 代表native方法所屬的對(duì)象。

最后會(huì)自動(dòng)生成jniLibs目錄

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者。

友情鏈接更多精彩內(nèi)容