SO完全なデモガウスぼかし効果を達成コンパイルAndroidのJNIライブラリー

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

 

公開された92元の記事 ウォン称賛27 ビュー90000 +

おすすめ

転載: blog.csdn.net/zhuxingchong/article/details/89217985