首先下载好ndk开发工具包,我的版本是android-ndk-r10b,没有的话请先下载好了解压到一个不含中文的文件下(别问为什么不能放中文的文件夹下),[点击这里下载ndk]
NDK r10链接: https://pan.baidu.com/s/1i4RamBb 密码: vphj
- 创建你的android studio 项目
- 开始配置你的ndk环境 ——>首先右键你的项目查看“open module Settings”进去可以看到
记住改路径是到
点击ok
- 在配置gradle.properities
接着配置改module的build.gradle
其中红色的代表是你要生成的.so文件的名称,蓝色的是在c/c++代码中要用的工具类,不用管 ndk {
moduleName “hello-jni”
ldLibs “log”
}`在你的java文件夹下开始编写要调用c的类或者直接到Activity里面编写,我这里直接写了一个类来调用nativte的方法`package com.sino.jnifrom;
/**
- Created by Administrator on 2016/10/18.
*/
public class JNiUtils {
static {
System.loadLibrary(“hello-jni”);
}
public static native String getStringFromJNi();
}
`
这个是我自己写的一个类,很简单的一个调用,这里不详细说。
- 现在开始生成c的头文件,这里介绍俩种方法(有很多种)。
1、
- 通过AS的Terminal命令行来执行javah命令,具体如下:
- 执行命令切换到java目录,
然后执行命令:javah +类全名(包名+类名)
javah后面有个空格,会在java目录下生成一个.h的头文件
2、通过cmd命令行来执行
- 建好了工程之后在工具栏的Build项执行make project—为了编译生成.class文件,然后切换到debug这个目录
- 执行命令结果如下:
执行成功的话会直接到当前目录生成一个.h的文件
- 在main路径创建一个jni文件,将c/c++文件和刚刚生成的头文件放里面
这里需要特别提醒下,创建了自己需要的c文件后还要创建一个空的c文件,里面什么也不写,别问我因为啥(工具的自身bug)
- 最后写c代码,将头文件里面的方法名拷贝到自己创建的c文件里面开始写c代码,不想多说c代码贴图最清晰
- 这里贴下c++代码:
- #include “com_sino_jnifrom_JNiUtils.h”
define LOG_TAG “System.out”
include
define LOGD(…) android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS)
define LOGINFO(…) android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS)
JNIEXPORT jstring
JNICALL Java_com_sino_jnifrom_JNiUtils_getStringFromJNi
(JNIEnv *env, jclass jclass) {
return env->NewStringUTF("我来自c++");
}
`运行程序效果如下:
好了,这是我觉得AndroidStudio最简单的一种配置~~
我上传了demo地址:
http://download.youkuaiyun.com/detail/androidexception/9657034
-如果你在你的Activity中执行命令javah 的时候报错:
错误: 无法访问Android.support.v7.app.AppCompatActivity
找不到android.support.v7.app.AppCompatActivity的类文件
搜索了一下,在这篇文章中找到答案:http://www.itnose.net/detail/6291798.html
原来是出现这个错误是因为编译的classpath 未加入v4和v7库