序文
アンドロイド・スタジオの下NDKこの導入構成のチュートリアル
テキスト
1.ダウンロードし、CMakeのNDK
ダウンロードが遅い場合は、別のダウンロードに行くことができます
2. SDKの構成とNDK
これは、NDKをダウンロードする前に、NDKアドレスです
あなたは内部のSDKの場所にパスSDKとNDKを設定した場合local.propertiesが構成ではない、そして、それが自動的に構成、または我々はルートに関連するSDKを設定する必要があり、local.propertiesにNDK
Gradle.properties設定ファイル
android.useDeprecatedNdk=true
3. JNIディレクトリを確立
JNIは、直接およびjniLibsフォルダを作成することができます
ビルドの設定
moduleNameののNDK構成は、ライブラリの名前が生成されるので、LIB + daoshuriwidget +の.so
ndk {
moduleName "daoshuriwidget"
abiFilters "armeabi", "x86","armeabi-v7a"
ldLibs "log"
}
JNIとjniLibs設定ディレクトリ、JNIでCファイル、結果jniLibs上のライブラリにあるので、
5.ネイティブメソッドを書きます
public class LittleWidgetWatcher {
static {
System.loadLibrary("daoshuriwidget");//导入so库
//导入在jniLibs下面的so库,名称和build中配置moduleName名称相同
}
//此方法就是用于调用c++的方法,要加上native
public native void openLittleWidgetWatcher(int uId);
}
6. .hファイルを生成
ディレクトリにターミナルアプリ、その後、CDを見つけるAS
输入javah -classpath build/intermediates/classes/meizu/debug -jni com.pybeta.daymatter.service.LittleWidgetWatcher
ルートディレクトリに生成された.hファイル
あなたが開発するために、次のファイルのメンバーで.hファイルを生成する場合は、ディレクトリJNIで-d、その後、生成された.hファイルを持つトップ
7. C ++のコードを書き始めます
C ++コードの下にJNI新しいフォルダ
名.hの修正とするために、次のJNIフォルダをコピーした.h
の.hを生成するためのC ++メソッドにファイルをコピー
//.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();
}
以下のC ++フォルダのインポート.hファイル
(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をコピーするためのライブラリは、
コンパイルするコンパイルボタンまたはCtrl + F9をクリックして、そのライブラリーを生成
(そのフォルダと一緒に)このようにライブラリがjniLibsにコピーすることに合意しました
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);
}
次NDKダブルデーモンプロセスを導入し、ダブルガード処理をNDK