1.下载NDK文件
我下的android-ndk-r13b-windows-x86_64.zip,解压,配置环境变量
(图片网上截取的,仅供参考)
cmd下测试ndk是否按照成功,如果成功如下所示:
(图片网上截取的,仅供参考)
Android studio工具里ndk相关配置
ndk从此处下载ndk解压过程中总是出错,所以采用的是上面的方法,直接网上下载。如果使用CMake开发NDK,此处下载CMake和LLDB
apply点击下载,需要一会时间
2.开始写相关代码了………
先看工程结构(里面包含有生成的libs和obj文件夹,自己不需要创建),创建jni文件夹
public class MainActivity extends Activity {
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
MyJNI myJNI = new MyJNI();
tv.setText(myJNI.sayHello());
}
}
JNI类
添加native接口注意写好native接口和System.loadLibrary()
public class MyJNI {
static {
System.loadLibrary("JniTest");//库名和gradle里面一致
}
public static native String sayHello();
}
local.properties文件配置如下:
ndk.dir=D\:\\ndk\\android-ndk-r13b
sdk.dir=D\:\\sdk
gradle.properties文件里添加如下:
Android.useDeprecatedNdk=true
build.gradle文件里面如下
android {
compileSdkVersion 23
buildToolsVersion "25.0.0"
defaultConfig {
//添加
ndk {
moduleName "JniTest" //库名字
//ldLibs "log", "z", "m"
abiFilters "armeabi", "armeabi-v7a", "x86"
}
}
//添加
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
}
注意:此时jni文件夹下是空的
AS –>Build–>Make Project,
在app\build\intermediates\classes\debug\com\example\t400\test文件夹下会生成相应的.class文件
javah生成.h文件
点击”View->Tool Windows->Terminal“,打开终端
xxxxx\app>cd build\intermediates\classes\debug
然后执行如下javah命令生成h文件
xxxxx\debug>javah -jni com.example.t400.test.MyJNI
执行完之后你可以在文件夹\app\build\intermediates\classes\debug下看见生成的 .h头文件为:
com.example.t400.test.MyJNI.h
其内容为:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_t400_test_MyJNI */
#ifndef _Included_com_example_t400_test_MyJNI
#define _Included_com_example_t400_test_MyJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_t400_test_MyJNI
* Method: sayHello
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL java_com_example_t400_test_MyJNI_sayHello
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
将 .h文件剪切,粘贴到上面创建的空jni文件夹里,在jni目录下新建一个c文件,随意取名为jnitest.c ,然后编辑其代码如下:
#include "jni.h"
#include "com_example_t400_test_MyJNI.h"
JNIEXPORT jstring JNICALL Java_com_example_t400_test_MyJNI_sayHello
(JNIEnv *env, jobject obj){
return (*env)->NewStringUTF(env,"this is test data!");
}
注:jnitest.c同目录下记得创建空的util.c文件,util.c文件是避免某bug忘记了,请搜索。
3.收尾工作
创建Android.mk和Application.mk文件
Android.mk在目录jni下,Android.mk文件如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JniTest
LOCAL_SRC_FILES := jnitest.c
LOCAL_SRC_FILES += util.c
include $(BUILD_SHARED_LIBRARY)
其中LOCAL_PATH是C/C++代码所在目录,也就是我们的jni目录。
LOCAL_MODULE是要编译的库的名称。编译器会自动在前面加上lib,在后面加上.so。
LOCAL_SRC_FILES是要编译的C/C++文件。
Application.mk在最外层与local.properties同目级,Application.mk文件如下:
APP_PROJECT_PATH := $(call my-dir)
APP_MODULES := JniTest
执行ndk-build命令生成所有cpu架构的so库
切换到jni目录执行
jni> ndk-build
如下:
看此刻的工程,图如下:
Android studio so 文件生成完毕!
注:上面的Make Project 也可以用Javac 命令把.class生成到相应的位置,然后在javah改路径
写在最后
so文件生成后的使用
在以上内容的基础上:
删除所有的 .mk 文件
删除所有的 .c 和 .h 文件
删除生成的obj文件夹和里面的所有文件
将生成的libs文件夹里的文件,拷贝到最外层的libs文件夹里,完成后删除该libs文件夹和里面的所有文件
至此一切OK!