android studio NDK 配置及入门案例

来源:互联网 发布:国家药品食品数据查询 编辑:程序博客网 时间:2024/06/04 19:35

据说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 __cplusplusextern "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的整体文件布局:







0 0
原创粉丝点击