您的位置:首页 > 移动开发 > Android开发

android studio NDK 配置及入门案例

2016-07-20 01:45 429 查看
据说android studio 的NDK现在开发已经很方便了,现在来尝试一波。

首先介绍一下我的android studio 环境 android studio 1.5

首先需要配置一下NDK开发环境:

1,下载android-ndk-r10,并解压 32位windows下载地址 64位windows下载地址

2,点击project structure--->选择SDK Location --->选择解压后的android-ndk-r10路径--->点击OK(这一步相当于配置了local.properties ,会在这个文件夹添加你ndk的路径)

3,一般ndk都不会是单独的一个工程,一般都会是工程中的一个module ,而且一般这个module 都是当做library来用。

因此下面新建一个module设置为library,名字为Test,生成module之后,就build一下module;

4,然后在module里面的build.gradle里面加上声明ndk模块的语句,即

ndk{
moduleName "test"
}


build.gradle文件里的android{}块儿,添加了上述语句后整体效果为:

android {
compileSdkVersion 23
buildToolsVersion "23.0.2"

defaultConfig {
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
ndk{
moduleName "test"
}


} buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }}



5,然后在Test的包com.example.dfy.test下编写一个文件HelloJNI.class,如图

HelloJNI.class的内容为

package com.example.dfy.test;

/**
* Created by Administrator on 2016/7/20.
*/
public class HelloJNI {

static {
System.loadLibrary("test");   //这里的名字要和build.gradle文件里的ndk名字保持一致
}
public static native String getHello();//这个方法就是要通过jni调用实现
}


然后build 一下这个module;

如果有提示诸如JNI 是实验版本,被忽略等的错误时,错误提示一般会提示让在工程的load.properties文件里加上这句

android.useDeprecatedNdk=true


,如果你public static native getStringFromC();这一句一直出现cannot solve corresponing jni function 的提示,(其实你不需要处理这个提示就行)

(如果你不想让提示,就请点击project structure ------>选择plugins———>这时如果你的android support ndk后面的对勾是选中的,请去掉对勾,点击确定,就能解决上面的错误提示。)

6,好了,现在如果没有其他错误就可以生成头文件(.h)了

在Android Studio 的Terminal 终端输入

cd test\src\main
其实就是进入test\src\main路径下,(这里Test是library module 的名字)

然后执行

javah  -d  jni  -classpath  ..\..\build\intermediates\classes\debug  com.example.dfy.test.HelloJNI


这句命令会在当前module下生成jni文件夹(-d ),并在jni文件夹下生成一个com_example_dfy_test_HelloJNI.h的头文件

具体如下:

com_example_dfy_test_HelloJNI.h的头文件内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_dfy_test_HelloJNI */

#ifndef _Included_com_example_dfy_test_HelloJNI
#define _Included_com_example_dfy_test_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     com_example_dfy_test_HelloJNI
* Method:    getHello
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_dfy_test_HelloJNI_getHello
(JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif


7,编写一个.c的文件名字任意命名,我这里名字命名为Hello.c
内容为:

#include "com_example_dfy_test_HelloJNI.h"

JNIEXPORT jstring JNICALL Java_com_example_dfy_test_HelloJNI_getHello
(JNIEnv *env, jclass jclass){
return (*env)->NewStringUTF(env,"Hello JNI !");
}
8,好了,按道理说.h和.c文件都有了,只要build一下module 就能生成.so文件了,

可是由于Android ndk平台还存在bug,至少我用的Android studio 1.5 版本有bug,会报错。

这里只需要在jni文件夹下再创建一个空的.c文件即可,名字可以随意命名,但不要重复,这里我命名为helio2.c。

然后在build 一下,然后如果没有出错,那么你就会看到test\build\intermediates会多出一个ndk文件夹,在ndk\debug\lib下生成了各个平台的.so文件,如图

最后看一下module test的整体文件布局:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: