Android-студия 的 NDK

предисловие

Это введение конфигурации учебник NDK под Android-студии

текст

1. Скачать и CMake NDK

Если загрузка идет медленно, вы можете пойти, чтобы загрузить отдельные


image.png

2. Конфигурация и НДК SDK

Это НДК адрес перед загрузкой НДК


image.png

Если вы установите путь и НДК SDK в папке SDK внутри, то не local.properties в конфигурации, она автоматически настраивает, или нам нужно настроить маршрут, связанные с SDK и NDK в local.properties

image.png

Gradle.properties файл конфигурации

android.useDeprecatedNdk=true


Sogou скриншоты 20180102171419.png

3. Установите JNI каталог

JNI может создать папку непосредственно и jniLibs
搜狗截图20180102170250.png

Настройка сборки

Конфигурация Ndk из ModuleName, название библиотеки генерируется так Lib + daoshuriwidget + .so

 ndk {
            moduleName "daoshuriwidget"
            abiFilters "armeabi", "x86","armeabi-v7a"
            ldLibs "log"
        }


搜狗截图20180102170716.png

JNI и jniLibs каталог конфигурации, гр файлов в JNI, полученный таким образом в библиотеке jniLibs

搜狗截图20180102171024.png

5. Напишите метод Native

public class LittleWidgetWatcher {
    static {
        System.loadLibrary("daoshuriwidget");//导入so库
         //导入在jniLibs下面的so库,名称和build中配置moduleName名称相同
    }

   //此方法就是用于调用c++的方法,要加上native
    public native void openLittleWidgetWatcher(int uId);
}

6. генерировать файл .h

AS найти терминал приложение, а затем перейдите в каталог

输入javah -classpath build/intermediates/classes/meizu/debug -jni com.pybeta.daymatter.service.LittleWidgetWatcher


搜狗截图20180102172333.png

Сформирован .h файл в корневом каталоге

搜狗截图20171225232725.png

Если вы хотите создать .h файлы в следующих членов файлов с целью разработки затем вверх с опцией -d, то сгенерированный файл .h в каталоге JNI

搜狗截图20171225233855.png

7. Начинайте писать C ++ код

JNI новая папка ниже кода C ++
модификаций .h имя и скопировать папку .h JNI ниже , чтобы
скопировать файл в C ++ метода для создания .h

//.h文件夹生成的代码
#ifndef _Included_com_fanao_daoshuri_ndkprotect_LittleWidgetWatcher
#define _Included_com_fanao_daoshuri_ndkprotect_LittleWidgetWatcher
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_fanao_daoshuri_ndkprotect_LittleWidgetWatcher
 * Method:    openLittleWidgetWatcher
 * Signature: (I)V
 */
JNIEXPORT void JNICALL Java_com_fanao_daoshuri_ndkprotect_LittleWidgetWatcher_openLittleWidgetWatcher
  (JNIEnv *, jobject, jint);

#ifdef __cplusplus
}
#endif
#endif

Поскольку никакой новой .h генерируется имя параметра метода, так что вы хотите, чтобы вручную добавить имя нового Сената

//c++下面的代码
JNIEXPORT void JNICALL
Java_com_fanao_daoshuri_ndkprotect_LittleWidgetWatcher_openLittleWidgetWatcher(JNIEnv *env,jobject instance, jint userId) {
//父进程 也就是小插件的进程
     user_id = userId;
/* sigaction用于信号处理,sa.sa_flags=SA_RESTART:使被信号打断的系统调用自动重新发起
 信号处理交给sig_handler处理的,当子进程挂了的时候会向其父进程发送一个SIGCHLD信号,
 父进程就会收到SIGCHLD信号,并且开始执行sig_handler方法,重生成子进程*/
     LOGI("开启进程\n");
     struct sigaction sa;
     sa.sa_flags = 0;
     sa.sa_handler = sig_handler;
     sigaction(SIGCHLD, &sa, NULL);
     create_child();
}

Импорт .h файл в папку C ++ ниже


搜狗截图20180102174028.png

Импорт соответствующих файлов заголовки (этот заголовок файл в common.h файл)

#include <signal.h>
#include <sys/wait.h>
#include <android/log.h>
#include <sys/types.h>
#include <sys/un.h>
#include <errno.h>
#include <stdlib.h>
#include <linux/signal.h>
#include <android/log.h>
#define LOG_TAG "widget"
#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
void create_child();
void child_start_monitor();

8. Библиотека составлена ​​так, поэтому библиотека скопировать jniLibs

Нажмите кнопку Compile или Ctrl + F9, чтобы компилировать, генерировать так библиотека


搜狗截图20180102173230.png


搜狗截图20180102172916.png

Это так библиотека (вместе с ее папками) согласилась быть скопирована в jniLibs

搜狗截图20180102173334.png

9. С помощью JNI метода запуска проекта

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate( savedInstanceState );
        setContentView( R.layout.activity_main );
        Intent intent = new Intent(this, LittleWidgetService.class);
        startService(intent);
    }

Далее ввести НКА двойного процесса демона НКА двойного процесса охраны

рекомендация

отblog.csdn.net/k393393/article/details/78954115