使用Android Studio开发NDK

来源:互联网 发布:温什么知什么的成语 编辑:程序博客网 时间:2024/05/21 13:22


1、NDK开发环境配置

在使用NDK之前,需要下载NDK支持包

可以先去网站下载好包再导入到AndroidStudio中 

NDK下载地址:https://developer.android.com/ndk/downloads/index.html

或者直接在AndroidStudio中下载


这里我已经下载好并配置到AndroidStudio了


配置好NDK后我们还需要配置build.gradle文件,注意这里的gradle文件是Modle中的gradle

android{     ......     defaultConfig{          ......          ndk{               moduleName "myJniLibName"               ldLibs "log"               abiFilters "armeabi","armeabi-v7a","x86"          }     }     ......}

moduleName:生成.so库文件的名称

ldLibs: 引入一些库,这里我们引入打印log所需要的库

abiFilters: 输出指定的三种abi体系结构下的so库文件

到这里我们的NDK开发环境就算集成好了


2、创建对应native方法的.h头文件

新建一个类GetString.java

/*** 获取字符* Created by zhuwentao on 2016-07-30.*/public class GetString {    static {        // 静态初始化代码块,这里加载的库名称要和 gradle 中定义的 moduleName 名称一致        System. loadLibrary( "myJniLibName");    }    // 该处报红,是因为在本地没有对应的 JNI 函数,但不影响编译    public static native String getNativeStr();}

写完后需要使用 Build->Make Project 一下,生成.class文件,生成的.class文件在..\build\intermediates\classes\debug\zhuwentao\com\pathdemo下



打开cmd或者AndroidStudio中自带的Terminal,如果是Terminal则会自动进入到当前项目所在的根目录下
进入\src\main文件夹下,输入以下命令

javah -d jni -classpath D:\Users\Administrator\AppData\Local\Android\sdk\platforms\android-19\android.jar;..\..\build\intermediates\classes\debug zhuwentao.com.pathdemo.GetString


这里的“D:\Users\Administrator\AppData\Local\Android\sdk\platforms\android-19\android.jar”是我本机上的android.jar路径,”zhuwentao.com.pathdemo.GetString “是包名+需要编译的类名。 
这两个路径需要根据你自己的本地路径进行修改。

执行成功后就可以在main文件夹下发现多了个jni文件夹,里面有生成的.h头文件,jniTest.c文件是我们自己创建的,用来实现zhuwentao_com_pathdemo_GetString.h头文件中的方法。



zhuwentao_com_pathdemo_GetString.h文件的内容

/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* 要使用Log则需要引用 android/log.h 这个头文件 */#include <android/log.h>/* Header for class zhuwentao_com_pathdemo_GetString *//* 可以根据需要调用不同类型的 LOG */#ifndef LOG_TAG#define LOG_TAG "ANDROID_LOG"#define LOG_E(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG , __VA_ARGS__)#define LOG_I(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG , __VA_ARGS__)#define LOG_W(...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG , __VA_ARGS__)#define LOG_D(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG , __VA_ARGS__)#endif#ifndef _Included_zhuwentao_com_pathdemo_GetString#define _Included_zhuwentao_com_pathdemo_GetString#ifdef __cplusplusextern "C" {#endif/** Class:     zhuwentao_com_pathdemo_GetString* Method:    getNativeStr* Signature: ()Ljava/lang/String;*/JNIEXPORT jstring JNICALL Java_zhuwentao_com_pathdemo_GetString_getNativeStr  (JNIEnv *, jclass);#ifdef __cplusplus}#endif#endif

编译生成的.so库文件在这个目录下

..\PathDemo\app\build\intermediates\ndk\debug\obj\local


3、在jniTest.c文件中实现.h头文件中的函数

#include "zhuwentao_com_pathdemo_GetString.h"JNIEXPORT jstring JNICALL Java_zhuwentao_com_pathdemo_GetString_getNativeStr  (JNIEnv *env, jclass jObj){    LOG_E ("log 类型 _E");    LOG_I ("log 类型 _I");    LOG_D ("log 类型 _D");    LOG_W ("log 类型 _W");    return (*env)->NewStringUTF(env, "Hello World!!!");  }

功能就是返回一个“Hello World!!!”字符串,并打印不同的Log提示信息


4、Android界面展示

布局文件activity_main.xml

<? xml version= "1.0" encoding= "utf-8" ?><RelativeLayout    xmlns: android ="http://schemas.android.com/apk/res/android"    android :layout_width= "match_parent"    android :layout_height= "match_parent"    android :gravity= "center">    <TextView        android:id= "@+id/tv_ndk_text"        android:layout_width= "wrap_content"        android:layout_height= "wrap_content"        android:textSize= "28sp"/></RelativeLayout >

MainActivity.java文件

public class MainActivity extends AppCompatActivity {    private TextView mTextView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super .onCreate(savedInstanceState);        setContentView(R.layout. activity_main);        mTextView = (TextView) findViewById(R.id. tv_ndk_text);        // 显示getNativeStr()返回的字符串        mTextView.setText(GetString. getNativeStr());    }}

运行项目

打印的Log信息


Android界面




0 0
原创粉丝点击