在学习NDK编程之前,看了很多网上的配置教程,这些教程要么时间久远,要么用到的工具的版本不是最新的,所以对于当前最新环境下的NDK配置以及开发,只能做一部分参考,下面来说下我的初试流程。
工具和环境:
Android 开发工具:Android Studio 2.1.2
Android NDK:android-ndk-r10d
java环境:jdk-8u60
1、新建一个Android工程
2、进入File —> Project Structure,配置NDK的所在路径
3、在gradle.properties的最后一行添加一句话,否则编译失败
android.useDeprecatedNdk=true
4、在MainActivity中加载so库,并调用JNI方法
package com.yyp.ndkdemo; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends Activity { static { System.loadLibrary("jni-test"); //加载libjni-test.so这个库 } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView textView = (TextView) findViewById(R.id.text); textView.setText(getString()); //调用JNI方法 } public native String getString(); //JNI方法 }
5、在main目录下,New —> Folder — JNI Folder,新建一个jni目录,然后创建3个文件:test.c 、Android.mk 、Application.mk
1)test.c
#include <jni.h> /** * 方法命名规则:Java_包名_类名_JNI方法名 */JNIEXPORT jstring JNICALL Java_com_yyp_ndkdemo_MainActivity_getString(JNIEnv *env, jobject this){ return (*env)->NewStringUTF(env,"Hello from JNI!"); }
2)Android.mk
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := jni-test LOCAL_SRC_FILES := test.c include $(BUILD_SHARED_LIBRARY)
上面 jni-test 是so库名称,test.c是JNI调用的C代码
3)Application.mk
App_ABI := armeabi
APP_ABI表示cpu的架构平台的类型,如果为all,会编译生成所有cpu平台的so库
6、在app目录下的build.gradle中配置jni的资源文件路径,否则导入头文件<jni.h>会变红色,报错
android { ...... sourceSets.main { jni.srcDirs = [] } }
7、打开Android Studio 的Terminal,cd进入到jni的上级目录,也就是main目录,然后输入命令ndk-build,最后就在main/libs/armeabi下生成一个叫libjni-test.so的库
D:\workspace_android\NDKDemo\app\src\main>ndk-build [armeabi] Compile thumb : jni-test <= test.c [armeabi] SharedLibrary : libjni-test.so [armeabi] Install : libjni-test.so => libs/armeabi/libjni-test.so
8、因为生成的so库默认都在libs下,所以为了以后操作方便,在app目录下的build.gradle中配置jniLibs的资源文件路径
android { ......sourceSets.main { jni.srcDirs = [] jniLibs.srcDirs "src/main/libs" }}
9、运行Android工程,成功,效果如下:
还有另一种方法,这里就不讲了,大家可以自己去试试。