Android Studio3でのJNIのセットアップ

そして

作業中のAndroidStudioプロジェクトでJNIを使​​用しています。現在、これに似たC ++ライブラリがあります。

#include <jni.h>
...
extern "C" {
    JNIEXPORT jobject JNICALL Java_com_cerbyarms_cerbyarms_esra_camera_CameraActivity_FindFeatures(JNIEnv* env, jobject, jlong maskMat)
    {
        ...
        jclass rectClass = env->FindClass("org/opencv/core/Rect");
        jmethodID rectID = env->GetMethodID(rectClass, "<init>", "(IIII)V");
        return env->NewObject(rectClass, rectID, x, y, width, height);
    }
}

これは機能します。ただし、非効率的です。これが実行されるたびに、rectClassはクラスを再検索する必要があり、プログラム内で一定のままである他の変数は、関数FindFeaturesが呼び出されるたびに再計算および再定義する必要があります。

Stack Overflowでこの回答に出くわしました(これは、私がやろうとしていることの例を示しているという事実を除けば、この質問とは関係ありません)。これは、JNIを使​​用する場合のネイティブファイルの異なるレイアウトを示しています。

こんな感じでした

static jclass java_util_ArrayList;
static jmethodID java_util_ArrayList_;
jmethodID java_util_ArrayList_size;
jmethodID java_util_ArrayList_get;
jmethodID java_util_ArrayList_add;
static thread_local JNIEnv* env;

void init() {
    java_util_ArrayList      = static_cast<jclass>(env->NewGlobalRef(env->FindClass("java/util/ArrayList")));
    java_util_ArrayList_     = env->GetMethodID(java_util_ArrayList, "<init>", "(I)V");
    java_util_ArrayList_size = env->GetMethodID (java_util_ArrayList, "size", "()I");
    java_util_ArrayList_get  = env->GetMethodID(java_util_ArrayList, "get", "(I)Ljava/lang/Object;");
    java_util_ArrayList_add  = env->GetMethodID(java_util_ArrayList, "add", "(Ljava/lang/Object;)Z");
}

std::vector<std::string> java2cpp(jobject arrayList) {
    jint len = env->CallIntMethod(arrayList, java_util_ArrayList_size);
    std::vector<std::string> result;
    result.reserve(len);
    for (jint i = 0; i < len; i++) {
        jstring element = static_cast<jstring>(env->CallObjectMethod(arrayList, java_util_ArrayList_get, i));
        const char* pchars = env->GetStringUTFChars(element, nullptr);
        result.emplace_back(pchars);
        env->ReleaseStringUTFChars(element, pchars);
        env->DeleteLocalRef(element);
    }
}

これは、一度だけ宣言および計算されたように見える高価で定数の変数を持つネイティブファイルを示しています。

Android Studio IDEのみを使用して同様のことを実現するにはどうすればよいですか?Android Studio IDEの設定で外部ツールを設定する必要はありませんが、コードをコンパイルするたびにAndroidStudioとCMDなどを切り替え続けたくありません。

理想的には、これMake Projectはヒットしたときにすべて正しく処理できますこれはAndroidStudio 3で可能ですか?

アレックスコーン

あなたは100%正しいです、いくつかのJNI値はキャッシュされて再利用されるように頼みます。クラス参照とメソッドIDは良い例です。ことを覚えておいてくださいFindClassが()が必要なので、地元の参照を返します()NewGlobalRefを各クラスについて、あなたはキャッシュに保持します。

Android Studioはこのセットアップを支援しません。また、このようなリファクタリングを実行できる信頼性の高いツールを私は知りません。グッドプラクティスは、WebRTCJNIラッパーSpotifyJNIヘルパーなどのオープンソースコードから学ぶことができます

Android Studioは、キャッシュされたオブジェクトや変換などではなく、ネイティブメソッドのみを追跡できます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Android Studio3でのプロキシの問題

分類Dev

Android Studio3制約レイアウトエディターの問題

分類Dev

Android Studio3で非推奨のメソッドがマークされなくなりました

分類Dev

Android Studio3でのGoogleRecaptchaのレンダリング

分類Dev

Android Studio3でのExecutorのコンパイルエラー

分類Dev

Android Studioでのアセットフォルダーの追加

分類Dev

WindowsでのAndroid用Dlibのセットアップ

分類Dev

Android Studio gradle buildConfigField セットアップ

分類Dev

Android Studio3新しいプロジェクトの作成エラー。Gradle同期に失敗し、依存関係を解決できません

分類Dev

Android Studio:Ubuntu 18.10での「プロジェクトのセットアップ:キャッシュからの読み取り」ストール

分類Dev

Android Studio 3.3がプロジェクトのセットアップでスタック:キャッシュからの読み取り

分類Dev

アプリの購入でAndroidをリセット

分類Dev

Androidで照会されたアダプターのリセット

分類Dev

Androidライブラリモジュールをセットアップし、Android Studioの複数のプロジェクトで参照する方法

分類Dev

Android-StudioのセットアップにAndroidsdkチェックボックスがありません

分類Dev

API 26用のGradleのセットアップ(Android)

分類Dev

iOS / Android用のサーバーのセットアップ

分類Dev

Android Studio0.2.6およびZBarプロジェクトのセットアップ

分類Dev

Android Studioアップデート後のAndroid Gradle CompilationFailedException

分類Dev

Android Studioのアセットフォルダー?

分類Dev

Android Studio3で正常に機能しないすべての場所を検索

分類Dev

Android Studio3でandroidManifest.xmlのエンコーディングをUTF-8に変更します

分類Dev

Android Studio、.gitignoreファイルを使用したMercurialリポジトリのセットアップ

分類Dev

Android Studio: CountDownTimer のリセット

分類Dev

最高のAndroid仮想デバイスのセットアップ(AVDセットアップ)

分類Dev

Android Dagger2.14のセットアップ

分類Dev

androidを使用したAndroidOpencvのセットアップ

分類Dev

El Capitan(OS X 10.11)でAndroid Studioをセットアップする方法

分類Dev

Visual Studio TeamServicesでAndroidビルドをセットアップする方法

Related 関連記事

  1. 1

    Android Studio3でのプロキシの問題

  2. 2

    Android Studio3制約レイアウトエディターの問題

  3. 3

    Android Studio3で非推奨のメソッドがマークされなくなりました

  4. 4

    Android Studio3でのGoogleRecaptchaのレンダリング

  5. 5

    Android Studio3でのExecutorのコンパイルエラー

  6. 6

    Android Studioでのアセットフォルダーの追加

  7. 7

    WindowsでのAndroid用Dlibのセットアップ

  8. 8

    Android Studio gradle buildConfigField セットアップ

  9. 9

    Android Studio3新しいプロジェクトの作成エラー。Gradle同期に失敗し、依存関係を解決できません

  10. 10

    Android Studio:Ubuntu 18.10での「プロジェクトのセットアップ:キャッシュからの読み取り」ストール

  11. 11

    Android Studio 3.3がプロジェクトのセットアップでスタック:キャッシュからの読み取り

  12. 12

    アプリの購入でAndroidをリセット

  13. 13

    Androidで照会されたアダプターのリセット

  14. 14

    Androidライブラリモジュールをセットアップし、Android Studioの複数のプロジェクトで参照する方法

  15. 15

    Android-StudioのセットアップにAndroidsdkチェックボックスがありません

  16. 16

    API 26用のGradleのセットアップ(Android)

  17. 17

    iOS / Android用のサーバーのセットアップ

  18. 18

    Android Studio0.2.6およびZBarプロジェクトのセットアップ

  19. 19

    Android Studioアップデート後のAndroid Gradle CompilationFailedException

  20. 20

    Android Studioのアセットフォルダー?

  21. 21

    Android Studio3で正常に機能しないすべての場所を検索

  22. 22

    Android Studio3でandroidManifest.xmlのエンコーディングをUTF-8に変更します

  23. 23

    Android Studio、.gitignoreファイルを使用したMercurialリポジトリのセットアップ

  24. 24

    Android Studio: CountDownTimer のリセット

  25. 25

    最高のAndroid仮想デバイスのセットアップ(AVDセットアップ)

  26. 26

    Android Dagger2.14のセットアップ

  27. 27

    androidを使用したAndroidOpencvのセットアップ

  28. 28

    El Capitan(OS X 10.11)でAndroid Studioをセットアップする方法

  29. 29

    Visual Studio TeamServicesでAndroidビルドをセットアップする方法

ホットタグ

アーカイブ