美文网首页
android JNI “ hello world”

android JNI “ hello world”

作者: XX杰 | 来源:发表于2018-01-18 12:14 被阅读0次

使用 android studio进行开发。 编译环境是 Android.mk.

首先,新建一个 android project 也不用 勾选 C++的选项,因为我这里不使用 CMake

    首先 简单配置一下 Android.mk 和 Application.mk 这两个文件 简历在main 目录下面的 jni 文件夹中。
    同时 .cpp 文件也放在这个文件夹里面。

  在build.gradle 中配置 简单的 NDK 信息。
        defaultConfig {
    applicationId ""
    minSdkVersion 21
    targetSdkVersion 26
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

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

android 标签下添加

    sourceSets.main {
          //  jniLibs.srcDirs = ['src/main/jniLibs','libs']
          jniLibs.srcDirs = ["src/main/libs"]  //指向要使用的库文件//的路径,前边的是自己项目的,后边的是第三方的so
          jni.srcDirs=[]  //禁止gradle 自动编译,使用已经编译好的So库
    }

放在android标签外面

  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 中的配置 —— 详细说明自行google

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

Application.mk 中的配置—— 详细说明请看官方文档

      APP_OPTIM := release
      APP_PLATFORM := android-9
      APP_ABI := armeabi-v7a  //APP_ABI := all代表生成所有平台的库文件
      APP_STL := gnustl_static
      APP_CPPFLAGS :=-O3 -std=c++11 -frtti -fexceptions

java 中的code

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

       public static native String helloJni();

对应的 C++ code ,C++与C 是用区别的

    #include <string.h>
    #include <jni.h>
    extern "C" {  // 声明编译环境是 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 .");
 }

    每个native函数,都至少有两个参数(JNIEnv*,jclass或者jobject)。

        1)当native方法为静态方法时:
                  jclass 代表native方法所属类的class对象(JniTest.class)。
        2)当native方法为非静态方法时:
                jobject 代表native方法所属的对象。

最后会自动生成jniLibs目录

相关文章

网友评论

      本文标题:android JNI “ hello world”

      本文链接:https://www.haomeiwen.com/subject/icnioxtx.html