不少so库都是用NDK写的, 方便作成工具库
javascript
打开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
笔者文件名是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的
也就是MainActivity类文件,在onCreate(Bundle savedInstanceState)加上调用上面的代码
String text = JNITest.getText();
//showAlert(text);
new AlertDialog.Builder(this).setMessage(text).setPositiveButton("OK", null).create().show();复制代码
后面若是正常,运行app效果图以下,就是写的NDK应用是成功的,最后就开始新的征程了...
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文件, 在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会弹出一个对话框,这就完成了
参考文献: