1、打开项目后,一次点击Tools>SDK Manager
2、点击SDK Tools标签页
3、选中NDK(Side by Side)和CMake复选框
4、点击OK
此时系统会显示一个对话框,告诉你NDK软件包占用了多少磁盘空间
5、点击OK
6、安装完成后,点击finish
7、您的项目会同步build文件并执行构建,修改构建过程中所有的错误
如果您想要使用SDK管理器未包含的CMake版本,请按以下步骤操作:
1、从CMake官方网站下载并安装CMake
2、在模块的build.gradle文件中指定您想要让gradle使用的CMake版本
3、将CMake的安装路径添加到PATH环境变量,或将其添加到项目的local.properties文件中,如下所示。如果Gradle找不到您在build.gradle文件中指定的CMake版本,就会出现构建错误。
If you set this property, Gradle no longer uses PATH to find CMake.
cmake.dir = “path-to-cmake”
4.可以不安装
,如果您尚未在工作站上安装Ninja构建系统,请访问Ninja官网 ,然后下载并安装适用于您的操作系统最新版Ninja。此外,请务必将Ninja的安装路径也添加到PATH环境变量。
5、在local.properties的文件添加NDK的路径和SDK的路径
sdk.dir=C:\Users\admin\AppData\Local\Android\Sdk
ndk.dir=C:\Users\admin\AppData\Local\Android\Sdk\ndk
6、在Project Structure配置SDK和NDK的路径
7、配置gradle.properties文件,输入图中红色框内的内容
8、在build.gradle文件中ndk的模块
9、指定android编译中c代码不用gradler编译,jniLib的库的加载目录
10、目录的结构如图
Application.mk和Android.mk
//Application.mk
APP_STL := c++_static
APP_CPPFLAGS := -frtti -fexceptions -std=c++0x
APP_ABI := arm64-v8a
APP_PLATFORM := android-19
//Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := playMusic
LOCAL_SRC_FILES := playMusic.so
include $(PREBUILT_SHARED_LIBRARY)
//上面的部分是指引用第三方so的配置
include $(CLEAR_VARS)
LOCAL_MODULE := tinyplayJni
LOCAL_SRC_FILES := com_aac_richtap_PlayMusic.cpp
LOCAL_LDLIBS += -llog
LOCAL_SHARED_LIBRARIES := playMusic
LOCAL_EXPORT_C_INCLUDES := src/main/jni
include $(BUILD_SHARED_LIBRARY)
11、以上配置完成后
在Terminal终端输入ndk-build 出现下图所示就表示成功了
12、最后一步就是使用System.loadLibrary将so加载到java代码
public class PlayMusic {
public static native void setDeviceAndCard(int card,int device);
public static native void playMusicByName(String name);
static {
System.loadLibrary("tinyplayJni");
}
}
//在需要的activity中调用
PlayMusic music = new PlayMusic();
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
music.setDeviceAndCard(3,0);
Log.d("Main", "onClick: ");
}
});
最后留言:为了直接将java文件编译成jni的头文件可以在配置以上的环境之后使用
输入命令javah -jni com.example.mr5.jnidemo.JniUtil --------包名+类名
如果报找不到该类的错误,用javah -classpath . -jni com.example.mr5.jnidemo.JniUtil。
插入部分
引用系统文件且自定义一个so库
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := playMusic
#LOCAL_MODULE := playMusicZero
LOCAL_SRC_FILES := PlayMusic.cpp \
Interface.cpp
LOCAL_SHARED_LIBRARIES := liblog libcutils libutils libtinyalsa
LOCAL_MODULE_TAGS := optional
LOCAL_C_INCLUDES += external/tinyalsa/include //引入其他目录的头文件方式 在cpp文件中使用#include<***>的方式引用
LOCAL_CFLAGS += \
-Wno-unused-parameter \
-Wno-unused-function \
-Wno-unused-variable
#include $(BUILD_EXECUTABLE)
include $(BUILD_SHARED_LIBRARY)
//在Android.mk同目录下面的文件
Interface.cpp
PlayMusic.cpp
PlayMusic.h