Android Stuido 开发第一个NDK应用

1,784 阅读3分钟

引言:

 很多so库都是用NDK写的, 方便做成工具库

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

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

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

安装好后,可以在目录下找看有没有ndk文件夹, 或者ndk-bundle文件夹,两个都一样,备用

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

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

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

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

笔者文件名是JNITest.java, 代码如下

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

    public native static String getText();
}

然后点击 Build -> Make Project , 将Java文件编译成class文件,,文件可以在下图找有没有生成的

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

没有classes就有javac,

然后, 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程序  点这