目前在Android studio中NDK有两种开发方式:
1.Cmake方式:比较麻烦,可能google还没有完善,如果想使用的话直接读Android ndk开发文档,个人读了,Cmake方式比较麻烦
2.ndk-build创建方式,(google官网也说了)个人还没有发现官网哪里有介绍
这里介绍一个Android studio的快捷功能
打开settings->进入External Tools;如果External Tools什么都没有的话,点击“+”进行创建 javah ndk-build 如图:
按照图中配置和添加进行设置,注:注意下面三行中的内容填写,j
Program:分别填写javah和ndk-build的实际硬盘中的目录
Parameters:(其实是填写将在DOS中执行的命令)
javah配置: -classpath $SourcepathEntry$\..\..\..\build\intermediates\classes\debug;C:\TypeCode\AndroidSDK\platforms\android-25\android.jar-d $SourcepathEntry$\..\jni -jni $FileClass$ 其中红字部分是你的android.jar包的位置 后面的-d,是你想输出.h文件的路径,这里是java目录下的jni目录
ndk-build配置:NDK_LIBS_OUT=$ModuleFileDir$\src\main\jniLibs 这个意思是输出到src\main下的jniLibs中,如果直接写,但是本地没这个目录的话,会直接创建一个,
配置完点击ok,回到Android Studio项目根目录,如图,右键发现,列表中多了一个NDK,如图:
到这里就配置完我们的工具了
好,下面开始进行ndk配置,
前提:下载ndk开发包,推荐一个网站www.androiddevtools.cn 下载各类Android工具,
放在指定目录,进入Android studio中的project structure配置ndk路径,需要让AS找到ndk
1.创建JniTest.java文件,右键该文件,选择上图中的javah,直接编译成.h头文件直接输出到自己设置的文件目录中,插入代码如下:
public class JniTest{
static {
System.loadLibrary("jnitest");
}
//native方法
public static native String sayHello();
}
2.生成的头文件如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class robot_tangwa_tangwarobot_JniTest */
#ifndef _Included_robot_tangwa_tangwarobot_JniTest
#define _Included_robot_tangwa_tangwarobot_JniTest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: robot_tangwa_tangwarobot_JniTest
* Method: sayHello
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_robot_tangwa_tangwarobot_JniTest_sayHello
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
3.自己在输出到头文件目录下编写.cpp文件,这里目录问java\jni 目录,点击创建c++文件JniTest.c,写方法
#include "robot_tangwa_tangwarobot_JniTest.h"
JNIEXPORT jstring JNICALL Java_robot_tangwa_tangwarobot_JniTest_sayHello
(JNIEnv *env, jclass jclass){
return env->NewStringUTF("gaunzedong");
}
4.写Android.mk文件(.mk文件和头文件资源文件尽量在一个目录下)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JniTest
LOCAL_SRC_FILES := jnitest.cpp
include $(BUILD_SHARED_LIBRARY)
这里项目名字和资源文件自己根据自己的情况更改一下
5.使自己的ndk和gradle产生关联
1)在gradle.properties 添加 (注意是project下的)
android.useDeprecatedNdk = true2)在app下的build.gradle中的defaultConfig模块下添加
ndk{ moduleName "jnitest" ldLibs "log" abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'arm64-v8a' }3)build-》Make Project。进行项目make,使gradle关联上ndk
Tools-》Android-》sysc Project
4)通过在之前创建的jni文件夹上右键,(这次用到了ndk-build,我们之前创建的快捷功能),项目会直接生成在jniLibs下各类的库
注:创建快捷功能这个方案是参考一个博客的,但是忘了链接
以上就是配置ndk的过程,如果出现javah的问题,请参考前两篇文章,
第一天写博客,可能有很多不足的地方和细节不对的地方,欢迎指出,同时很多问题需要根据自己电脑实际环境进行才能彻底解决问题。
注:AS1.3等有一个bug,就是如果创建工程使用的是API23,则工程不能弹出project structure在windows的AS下,
欢迎留言
2017/10/6 17:36
补充一条,如果需要导入外部的.so库需要在build.gradle 中的android下面添加sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
注:自学软硬嵌入式的可加QQ群:371776285