Android studio配置
确保Android Studio安装下图中 sdk tools
image
1、自动配置ndk
新建工程时勾选 Include C++ support ,ndk开发环境会自动配置好
image
2、手动配置ndk开发环境
- 在工程main文件夹下创建cpp文件夹
- 在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 <jni.h>
/* 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 <unistd.h>
#include "com_yangc_jnicmarkapplication_JniUtils.h"
#include <android/log.h>
#include <stdio.h>
#include <sys/system_properties.h>
#include <string>
#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!");
}
网友评论