1 在AS的设置中找到SDK Tools中找到ndk选择 点击apply 按照提示安装好
2在需要用到C的类中进行声明native方法
如:
private nativeStringinit(String deviceInfo);
并且加入以下代码
static{
System.loadLibrary("file-watch");//加载so文件 该步骤可以放到最后,该名称为类库的别名
}
3切换到项目的mian目录 使用javah命令生成头文件
先对项目进行clean project命令 然后在rebuild project
其实这一步主要是为了生成class文件
当然也可以自己用命令生成class文件
javac xxxx.java
cd 到项目的main目录下 在terminal输入该指令
javah -d jni -classpath /Users/DevilMayCry/Android-SDK/extras/android/m2repository/com/android/support/appcompat-v7/23.2.1/appcompat-v7-23.2.1-sources.jar:/Users/DevilMayCry/Android-SDK/platforms/android-19/android.jar:/Users/DevilMayCry/Android-SDK/extras/android/m2repository/com/android/support/support-v4/23.2.1/support-v4-23.2.1-sources.jar:../../build/intermediates/classes/debug com.qp.weirdnews.activity.MainActivity
javah:生成jni的头文件
-d:jni文件生成指定目录(也可以右键手动生成new--folder--jni folder)
-classpath:环境变量(我是这么理解的,没有具体去查),如我用到c的类继承了AppCompatActivity类,该类在v7的包中的support-v4-23.2.1-sources.jar,所以需要在classpath中加入该jar包的路径,通常android.jar包也会用到,所以也也加入该路径。中间用:冒号隔开(在window中需要用分号;隔开请注意) 最后到../../build/intermediates/classes/debug中用权限类名访问需要用到jni的类。
这样就会在jni文件中生成头文件如图
4根据javah产生的头文件进行修改并实现c源代码的文件
在相应的头文件中找到这样的方法(这种方法是根据用到的类的类名加方法名还有一些规则组成)
JNIEXPORTjstringJNICALLJava_com_qp_weirdnews_activity_MainActivity_init
(JNIEnv*,jobject,jstring);
然后在jni中创建一个c文件
#include<stdio.h>
#include<jni.h>
#include<stdlib.h>
#include"com_qp_weirdnews_activity_MainActivity.h"
JNIEXPORTjstringJNICALLJava_com_qp_weirdnews_activity_MainActivity_init
(JNIEnv* env,jobject obj,jstring string){
return(*env)->NewStringUTF(env,"my jni");
}
5 设置android.mk与application.mk文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := file-watch//该c库的别名
LOCAL_SRC_FILES := file-watch.c//c文件的文件名
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog
include $(BUILD_SHARED_LIBRARY)
上面是android.mk文件(其实就是一个文本文件)
application.mak文件内容可以是空
6在gradle properties文件中加入
在文件的最后一行加入:
android.useDeprecatedNdk=true
7然后在app文件下得build.gradle ->defaultConfig括号内添加如下代码
ndk {
moduleName "file-watch"//该类库的别名
}
还有别忘了在用到jni的类中加入
static{
System.loadLibrary("file-watch");//加载so文件 该名称为类库的别名
}
8编译
cd 到jni目录下 运行ndk-build 命令 如果没有问题 那就可以跑程序了。
9兼容
如果android studio版本为2.2运用了cmake
则需在在app文件下得build.gradle ->android下面加入代码
这个代码的作用是否让AS关联这些C代码,如果不加的话必须添加
jniLibs.srcDirs
externalNativeBuild {
ndkBuild {
path file("src\\main\\jni\\Android.mk")
}
}