Android Stuido 开发第一个NDK应用

引言:

 不少so库都是用NDK写的, 方便作成工具库
javascript

  1. 准备好Android Studio开发环境, ndk支持
  2. 须要javah命令, ndk-build命令

一, 第一次确保ndk已安装使用

打开SDK Manager工具, 找到LLDB, NDK 两个就能够, 显示未安装的就选上确认安装好,以下图php

安装好后,能够在目录下找看有没有ndk文件夹, 或者ndk-bundle文件夹,两个都同样,备用
css

进入ndk文件夹, 按下Shift键+鼠标右键, 选择 在此处打开命令窗口, 打开CMD窗口,输入命令ndk-build, 打印结果以下图是能正确使用的vue

接下来, 设置Android Studio 指定 ndk的路径, 操做File->Project Structure, 设置Android NDK Location为刚才的路径 以下图java

上面ndk就算配置好了,继续检查一下java,输入命令javah, 输出以下图是正常的, 不是的话,就须要配置javah 环境变量,,,此方法请自行百度
ios

二, 写一个用于编译成文件h的Java类

笔者文件名是JNITest.java, 代码以下c++

public class JNITest {
    static {
        System.loadLibrary("JNITest");
    }

    public native static String getText();
}复制代码

而后点击 Build -> Make Project , 将Java文件编译成class文件,,文件能够在下图找有没有生成的es6

文件路径好像有点长, 项目路径下,开始找 app/build/intermediatesweb

没有classes就有javac,sql

而后, javac/debug/.../classes 找到了,

接下来是com/example/myapplication/jni 相似于应用包名 com.example.myapplication.jni, 包名下有,如图

能够打开JNITest.class看看,这个自动生成的,就不贴源码了,其实这个是能够用javac命令吧Java文件编译成class的

三,在继承Activity类的中类文件修改调用

也就是MainActivity类文件,在onCreate(Bundle savedInstanceState)加上调用上面的代码

String text = JNITest.getText();
//showAlert(text);
new AlertDialog.Builder(this).setMessage(text).setPositiveButton("OK", null).create().show();复制代码

后面若是正常,运行app效果图以下,就是写的NDK应用是成功的,最后就开始新的征程了...

四, 用javah命令将class文件编译成h文件

Android Studio中选择项目文件下的app/src/main文件夹,鼠标右键,点击Open in Terminal, 相似于上面说的,在指定的路径下打开cmd命令窗口

输入命令按照格式来 ,以下

javah -d jni -classpath [存放class文件的路径] [包名.class文件名]

笔者输入,其中...省略了,太长不显示:

javah -d jni -classpath D:\...\app\build\intermediates\javac\debug\compileDebugJavaWithJavac\classes com.example.myapplication.jni

执行不出错的话, 在项目app/src/main目录下会出现jni文件夹,里面就有编译好的com_example_myapplication_jni_JNITest.h文件,打开看文件源码,以下

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_myapplication_jni_JNITest */
#ifndef _Included_com_example_myapplication_jni_JNITest
#define _Included_com_example_myapplication_jni_JNITest
#ifdef __cplusplusextern "C" {
#endif
/* * Class: com_example_myapplication_jni_JNITest * Method: getText * Signature: ()Ljava/lang/String; */
JNIEXPORT jstring JNICALL Java_com_example_myapplication_jni_JNITest_getText (JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif复制代码

五, 将h文件用ndk工具编译成so库

须要建立剩下的三个文件,除了h文件, 在jni目录下,如图

第一个文件, test.c, 本身写,源码以下

#include <jni.h>
#include <stdio.h>
#include "com_example_myapplication_jni_JNITest.h"
JNIEXPORT jstring JNICALL Java_com_example_myapplication_jni_JNITest_getText (JNIEnv *env, jclass obj){
    return (*env)->NewStringUTF(env, "This is my first NDK Application");
  }复制代码

第二个文件,Android.mk.内容以下

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JNITest
LOCAL_SRC_FILES := test.c
include $(BUILD_SHARED_LIBRARY)复制代码

第三个文件,Application.mk,内容以下

APP_ABI := all复制代码

还有,改下项目的app/build.gradle文件, 在部分sourceSets添加jni

sourceSets {
    main {
        java.srcDirs = ['src/main/java', 'src/main/java/lib']
        jniLibs.srcDirs = ['src/main/libs']
        jni.srcDirs = [] //屏蔽掉默认的jni编译生成过程
    }
}复制代码


接着,cd 命令进入项目app/src/main/jni目录, 用ndk-build命令生成so库文件, 输出以下结果算是正常的

生成so文件可在项目app/src/main/libs目录下看到

最后, 项目能够运行了,,运行过程顺利的话, App会弹出一个对话框,这就完成了


参考文献:

  • 使用Android Studio写出第一个NDK程序  点这
相关文章
相关标签/搜索