Android NDK 开发一般步骤(简单入手版)
首次在csdn中写博文,如有雷同不甚荣幸~亚当爱自拍:
编译工具: Android Studio
- 在所需Java类中声明Native方法
static {
System.loadLibrary("JniTest");
}
public native String getStringFromNative();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ndk);
TextView textView = (TextView) findViewById(R.id.textNdk);
textView.setText(getStringFromNative());
}
... prompt'''
- 编译成对应的class文件
make project一下,目的就是编译成对应的class文件。然后根据生成的class文件,利用javah生成对应的 .h头文件。 - Terminal操作
点开android studio 的Terminal标签页,默认进入到该项目的app文件夹下。如果在该目录下输入cd src\main 切换到main目录下 - 命令行操作
javah -d jni -classpath F:\androidSDK\platforms\android-22\android.jar;….\build\intermediates\classes\debug\ ui.NdkActivity
通过javah命令来生成对应的C头文件,….\build\intermediates\classes\debug\包名 .Class
查看在main目录下多了一个jni文件夹,里面有生成好的头文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class ui_NdkActivity */
#include <android/log.h>
/* Header for class ui_NdkActivity */
#ifndef LOG_TAG
#define LOG_TAG "ANDROID_LAB"
#ifndef _Included_ui_NdkActivity
#define _Included_ui_NdkActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: ui_NdkActivity
* Method: getStringFromNative
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_ui_NdkActivity_getStringFromNative
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
- 复制.h文件修改后缀名变为.c
简单实现代码输出
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
#include <android/log.h>
/* Header for class ui_NdkActivity */
#ifndef LOG_TAG
#define LOG_TAG"ANDROID_LAB"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
#endif
#ifndef _Included_ui_NdkActivity
#define _Included_ui_NdkActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: ui_NdkActivity
* Method: getStringFromNative
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_ui_NdkActivity_getStringFromNative
(JNIEnv * env, jobject jObj){
LOGE("log string from ndk.");
return (*env)->NewStringUTF(env,"Hello From JNI2222!");
}
#ifdef __cplusplus
}
#endif
#endif
- 加入NDK路径
在Android Studio工程目录下的local.properties文件中加入:ndk.dir=F:\NDK\android-ndk-r10d(本人用的是ndk-r10d) - 修改gradle配置文件
工程下边的自己的应用app 的bulid.gradle 以下的修改内容android{……}
productFlavors {
x86 {
versionCode Integer.parseInt("6" + defaultConfig.versionCode)
ndk {
abiFilter "x86"
}
}
mips {
versionCode Integer.parseInt("4" + defaultConfig.versionCode)
ndk {
abiFilter "mips"
}
}
armv7 {
versionCode Integer.parseInt("2" + defaultConfig.versionCode)
ndk {
abiFilter "armeabi-v7a"
}
}
arm {
versionCode Integer.parseInt("1" + defaultConfig.versionCode)
ndk {
abiFilters "armeabi", "armeabi-v7a"
}
}
}
一般只用到arm平台
- 使用os包(可无此操作)
sourceSets.main{
//让AS识别libs下的.so第三方包
jniLibs.srcDirs =['libs']}
defaultConfig{……..}添加
ndk {
moduleName "JniTest"
ldLibs "log", "z", "m"
abiFilters "armeabi", "armeabi-v7a", "x86"
}
dependencies{…….}添加(对应是否引入其他包)
compile fileTree(dir: 'libs', include: ['**.*'])
- rebuild工程
Android studio 2.1.2 gralde 注意 编译手机软件前首先把软件卸载掉,防止有些C文件修改后java 没有及时修改