Android Studio3.0 NDK配置与开发

android studio 相关说明 | 2019-01-07 03:12

系统: Mac os 10.13.3软件: Android Studio 3.0.1

在打开的项目中,从菜单栏选择 Tools > Android > SDK Manager。

选中 LLDB、CMake 和 NDK 旁的复选框

在终端打开环境变量配置文件

vim ~/.bash_profile添加环境变量

如果不熟悉环境变量的配置, 可以看一下这篇文章Mac环境变量设置

# Androidexport ANDROID_HOME=~/Library/Android/sdkexport ANDROID_ADB=~/Library/Android/sdk/platform-toolsexport ANDROID_NDK=~/Library/Android/sdk/ndk-bundleexport PATH=${PATH}:${ANDROID_HOME}:${ANDROID_ADB}:${ANDROID_NDK}创建Android项目1. 在类中声明native方法public class MainActivity extends AppCompatActivity{    static {        /**         * 加载动态库libhelloJni.so         * 加载so文件,不要带上前缀lib和后缀.so         */        System.loadLibrary("helloJni");    }    /**     * 定义本地方法接口,这个方法类似虚方法,实现是用c或者c++实现的     * @return     */    public native String get();    public native void set(String str);    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        TextView textView = (TextView) findViewById(R.id.tv_hello);        textView.setText(get());        set("hello world form MainActivity");    } }2. 实现Android项目中声明的native方法从 IDE 的左侧打开 Project 窗格并从下拉菜单中选择 Project 视图。

导航到 您的模块 > src,右键点击 main 目录,然后选择 New > Folder > JNI Folder, 并点击 Finish。

创建3个文件hello.cpp, Android.mk, Application.mkhello.cpp

#include <jni.h>#include <stdio.h>#ifdef __cplusplusextern "C" {#endif/** * 函数名规则: Java_包名_类名_方法名 * @param env  表示一个指向JNI环境的指针, 可以通过它来方位JNI提供的接口方法 * @param thiz 表示Java对象中的this * @return */jstring Java_com_qyh_hellojni_MainActivity_get(JNIEnv *env, jobject thiz) {    printf("invoke get in c++\n");    return env->NewStringUTF("Hello from JNI in helloJni.so !"); }void Java_com_qyh_hellojni_MainActivity_set(JNIEnv *env, jobject thiz, jstring string) {    printf("invoke set from C++\n");    char* str = (char*)env->GetStringUTFChars(string,NULL);    printf("%s\n", str);    env->ReleaseStringUTFChars(string, str); }#ifdef __cplusplus}#endifAndroid.mk

LOCAL_MODULE : 表示模块的名称LOCAL_SRC_FILES: 参与编译的源文件

# Copyright (C) 2009 The Android Open Source Project## Licensed under the Apache License, Version 2.0 (the "License");# you may not use this file except in compliance with the License.# You may obtain a copy of the License at##      -2.0## Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License.#LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS) LOCAL_MODULE    := helloJni LOCAL_SRC_FILES := hello.cppinclude $(BUILD_SHARED_LIBRARY)Application.mk

APP_ABI: 表示CPU的架构类型, 如armeabi, x86, mips

APP_ABI := armeabi3. ndk-build编译so库切换到jni目录的父目录, 即main目录, 执行ndk-build命令

这时候, NDK会创建一个和jni目录平级的目录libs, libs下面存放的就是so库

然后在app/src/main中创建一个名为jniLibs的目录, 将生成的so库复制到jniLibs目录

从 IDE 左侧打开 Project 窗格并选择 Android 视图。

右键点击您想要关联到原生库的模块(例如 app 模块),并从菜单中选择 Link C++ Project with Gradle

从下拉菜单中,选择 CMake 或 ndk-build。

如果您选择 CMake,请使用 Project Path 旁的字段为您的外部 CMake 项目指定 CMakeLists.txt 脚本文件。

如果您选择 ndk-build,请使用 Project Path 旁的字段为您的外部 ndk-build 项目指定 Android.mk 脚本文件。如果 Application.mk 文件与您的 Android.mk 文件位于相同目录下,Android Studio 也会包含此文件。

最终在Gradle中生成以下设置