Android studio配置
確保Android Studio安裝下圖中 sdk tools
1嘹锁、自動配置ndk
新建工程時勾選 Include C++ support ,ndk開發(fā)環(huán)境會自動配置好
2、手動配置ndk開發(fā)環(huán)境
- 在工程main文件夾下創(chuàng)建cpp文件夾
- 在cpp文件下創(chuàng)建 CMakeLists.txt
CMakeLists.txt中的內(nèi)容如下:
#設(shè)置最小的CMake編譯版本着裹,確保你能夠順利編譯
cmake_minimum_required(VERSION 3.4.1)
#指定庫名稱领猾,指定庫是靜態(tài)還是共享,并提供源代碼的相對路徑骇扇。
#您可以通過添加多個add.library()命令定義多個庫摔竿,CMake為您構(gòu)建它們。
#當(dāng)您構(gòu)建應(yīng)用程序時少孝,Gradle會自動使用您的APK打包共享庫继低。
add_library( #指定庫的名稱
helloJNI
#將該庫設(shè)置為一個共享庫
SHARED
#提供源文件的相對路徑
com_yangc_jnicmarkapplication_JniUtils.cpp)
# 將預(yù)構(gòu)建庫鏈接到你的本地庫中,這里的意思是將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的開發(fā)環(huán)境已經(jīng)配置好了稍走,接下來定義native函數(shù)如下:
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:
接下來使用javah在Terminal中生成頭文件,命令如下:
生成頭文件命令
cd app/build/intermediates/classes/debug/
javah com.yangc.jnicmarkapplication.JniUtils
生成結(jié)果如上圖中2
頭文件拷貝的cpp文件夾下婿脸,同時創(chuàng)建cpp文件粱胜,就可以愉快的進(jìn)行jni開發(fā)了。
生成的頭文件代碼:
/* 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!");
}