Android Studio Jni开发

Android studio配置

确保Android Studio安装下图中 sdk tools


image

1、自动配置ndk

新建工程时勾选 Include C++ support ,ndk开发环境会自动配置好


image

2、手动配置ndk开发环境

  • 在工程main文件夹下创建cpp文件夹
image
  • 在cpp文件下创建 CMakeLists.txt

CMakeLists.txt中的内容如下:

#设置最小的CMake编译版本,确保你能够顺利编译
cmake_minimum_required(VERSION 3.4.1)

#指定库名称,指定库是静态还是共享,并提供源代码的相对路径。
#您可以通过添加多个add.library()命令定义多个库,CMake为您构建它们。
#当您构建应用程序时,Gradle会自动使用您的APK打包共享库。

add_library( #指定库的名称
             helloJNI

             #将该库设置为一个共享库
             SHARED

             #提供源文件的相对路径
             com_yangc_jnicmarkapplication_JniUtils.cpp)

# 将预构建库链接到你的本地库中,这里的意思是将log库链接到helloJNI库中
target_link_libraries(helloJNI
                      android
                      log)
  • build.gradle中添加如下代码:

      android {
          compileSdkVersion 25
          buildToolsVersion "25.0.3"
          defaultConfig {
              ...
              externalNativeBuild {
                  cmake {
                      abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'arm64-v8a'
                  }
              }
              
          }
          externalNativeBuild {
              cmake {
                  path "src/main/cpp/CMakeLists.txt"
              }
          }
      }
    

至此,jni的开发环境已经配置好了,接下来定义native函数如下:

public class JniUtils {
    /**
     cd app/build/intermediates/classes/debug/
     javah com.yangc.jnicmarkapplication.JniUtils
     */
    static {
        System.loadLibrary("helloJNI");
    }
    public static native String getStringFromJni();
}

接着编译工程,在确保build中生成JniUtils.class 如下图中1:

image

接下来使用javah在Terminal中生成头文件,命令如下:

生成头文件命令

cd app/build/intermediates/classes/debug/
javah com.yangc.jnicmarkapplication.JniUtils

生成结果如上图中2

头文件拷贝的cpp文件夹下,同时创建cpp文件,就可以愉快的进行jni开发了。

生成的头文件代码:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include 
/* Header for class com_yangc_jnicmarkapplication_JniUtils */

#ifndef _Included_com_yangc_jnicmarkapplication_JniUtils
#define _Included_com_yangc_jnicmarkapplication_JniUtils
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_yangc_jnicmarkapplication_JniUtils
 * Method:    getStringFromJni
 * Signature: ()Ljava/lang/String;// 签名
 */
JNIEXPORT jstring JNICALL Java_com_yangc_jnicmarkapplication_JniUtils_getStringFromJni
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

cpp文件代码:

#include "time.h"
#include 
#include "com_yangc_jnicmarkapplication_JniUtils.h"
#include 
#include 
#include 
#include 

#define LOG_TAG "System.out"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

JNIEXPORT jstring JNICALL Java_com_yangc_jnicmarkapplication_JniUtils_getStringFromJni
        (JNIEnv *env, jclass clazz) {
    return env->NewStringUTF("Hello JNI with Android Studio and CMake!");
}

你可能感兴趣的:(Android Studio Jni开发)