Aガウスぼかしアルゴリズムで手才能クラスを防ぐために、そのコンパイルロング役に立たないプレイJNI NDKライブラリは最近、練習の手を実装する必要があります。もちろん、このアルゴリズムは、私はちょうどこのアルゴリズムのCコードは、アルゴリズムがCPUを食べるために非常に適しているなどのJavaよりC高い効率は、SOファイルを作ったのでので、ライブラリにコンパイルされて置くことに気づいていません。
NDKとJNIは、ここで説明されていない、と私はフォーカスがこのプロセスを使用するためにSOライブラリからコンパイルされると言うでしょう。
あなたはKJNI環境によってSOライブラリとJava層のコードの呼び出しを生成するための明確なプロセスC / C ++のコードを見ることができます上の写真。
SOは、我々は、エンジニアリングの内側に直接依存ライブラリモジュールを作成できるようにする方法断言するJavaライブラリとライブラリファイルおよび負荷層は、対応するインタフェースを必要ですので、私は、アンドロイドスタジオでコンパイルされた、以下の手順を実行して説明し始めました。
(1)は、パッケージ名を埋めるために必要な新たな依存ライブラリを作成します。
(2)設定ビルド環境
- Local.propertiesは、ライブラリプロジェクト内のファイルは、NDK工具位置を追加頼っ見つけます。
ndk.dir = /ホーム/ zhuxingchong /アンドロイド/ SDK / NDK-バンドル
NDK位置ファイル - >プロジェクトの設定は以下の見つけることができます
- 以前のバージョンとの互換性のためファイルの依存関係のgradle.propertiesを追加NDK
android.useDepreCateNdk =真
NDKコンパイルされたモジュールをbuild.gradleので、コンパイル済みのファイルMKは、ファイル、ファイルの依存関係を追加します。
apply plugin: 'com.android.library'
android {
compileSdkVersion 28
defaultConfig {
minSdkVersion 23
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
ndk{
moduleName "jni_blur"//生成so文件名
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild{
ndkBuild{
path "src/main/java/jni/Android.mk"//mk文件路径
}
}
}
(3)javaファイルに述べた機能
(4).hファイルを生成します
javahは-d JNI com.data.mylibrary.StackNativeコマンドが実行ターミナルてMyLibrary / src / main / javaディレクトリに.hファイルを生成します
ディレクトリの下にコマンド実行JNIディレクトリに生成され、生成されたjavaディレクトリの完了後
詳細な.hファイルのコードは次のようです
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_data_mylibrary_StackNative */
#ifndef _Included_com_data_mylibrary_StackNative
#define _Included_com_data_mylibrary_StackNative
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_data_mylibrary_StackNative
* Method: blurPixels
* Signature: ([IIII)V
*/
JNIEXPORT void JNICALL Java_com_data_mylibrary_StackNative_blurPixels
(JNIEnv *, jclass, jintArray, jint, jint, jint);
/*
* Class: com_data_mylibrary_StackNative
* Method: blurBitmap
* Signature: (Ljava/lang/Object;I)V
*/
JNIEXPORT void JNICALL Java_com_data_mylibrary_StackNative_blurBitmap
(JNIEnv *, jclass, jobject, jint);
#ifdef __cplusplus
}
#endif
#endif
それはガウスぼかし処理コードをより行うピクチャであるので、(5)は、特定のロジック.CまたはCPPファイルを作成し、ファイル名がCPPとして.Cサフィックス.hファイルを変更することができ、またはすることができます。
#include <android/log.h>
#include <android/bitmap.h>
#include "stackblur.h"
#define TAG "com_data_mylibrary_StackNative"
#define LOG_D(...) __android_log_print(ANDROID_LOG_DEBUG,TAG ,__VA_ARGS__)
JNIEXPORT void JNICALL
Java_com_data_mylibrary_StackNative_blurPixels
(JNIEnv
*env,
jclass obj, jintArray
arrIn,
jint w, jint
h,
jint r
) {
jint *pixels;
// cpp:
// pix = (env)->GetIntArrayElements(arrIn, 0);
pixels = (*env)->GetIntArrayElements(env, arrIn, 0);
if (pixels == NULL) {
LOG_D("Input pixels isn't null.");
return;
}
// Start
pixels = blur_ARGB_8888(pixels, w, h, r);
// End
(*env)->ReleaseIntArrayElements(env, arrIn, pixels, 0);
}
JNIEXPORT void JNICALL
Java_com_data_mylibrary_StackNative_blurBitmap
(JNIEnv
*env,
jclass obj, jobject
bitmapIn,
jint r
) {
AndroidBitmapInfo infoIn;
void *pixels;
// Get image info
if (AndroidBitmap_getInfo(env, bitmapIn, &infoIn) != ANDROID_BITMAP_RESULT_SUCCESS) {
LOG_D("AndroidBitmap_getInfo failed!");
return;
}
// Check image
if (infoIn.format != ANDROID_BITMAP_FORMAT_RGBA_8888 &&
infoIn.format != ANDROID_BITMAP_FORMAT_RGB_565) {
LOG_D("Only support ANDROID_BITMAP_FORMAT_RGBA_8888 and ANDROID_BITMAP_FORMAT_RGB_565");
return;
}
// Lock all images
if (AndroidBitmap_lockPixels(env, bitmapIn, &pixels) != ANDROID_BITMAP_RESULT_SUCCESS) {
LOG_D("AndroidBitmap_lockPixels failed!");
return;
}
// height width
int h = infoIn.height;
int w = infoIn.width;
// Start
if (infoIn.format == ANDROID_BITMAP_FORMAT_RGBA_8888) {
pixels = blur_ARGB_8888((int *) pixels, w, h, r);
} else if (infoIn.format == ANDROID_BITMAP_FORMAT_RGB_565) {
pixels = blur_RGB_565((short *) pixels, w, h, r);
}
// End
// Unlocks everything
AndroidBitmap_unlockPixels(env, bitmapIn);
}
(6)文書の作成MK
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := jni_blur //生成so文件名
LOCAL_SRC_FILES := stackblur.c com_data_mylibrary_StackNative.c load.c //所有需要编译的c/cpp文件
LOCAL_LDLIBS := -lm -llog -ljnigraphics
include $(BUILD_SHARED_LIBRARY)
Aplication.mk
APP_ABI := all
APP_PLATFORM:= android-23
APP_OPTIM := release
(7)ので、AARファイルとパッケージファイルをコンパイル
アンドロイドスタジオ右側gradle-> mylibrary->ビルド - >ビルドをクリックします。
適切なライブラリファイルの場所を生成します
(8)応答AARファイルので、プロジェクトのlibsプロジェクトにファイルをコピーします
(9)がbuild.gradleを使用することができる依存関係の最後の配置しました
注意:
生成されたヘッダファイルを実行javahは-d JNI com.data.mylibrary.StackNativeエラー
エラー:ビットマップの署名を決定することができません。
公共の静的なネイティブ無効blurBitmap(ビットマップビットマップ、INT R);改为
公共の静的なネイティブ無効blurBitmap(オブジェクトのビットマップ、INT R);
最終出典:アンドロイド-Jni_demo