【備忘録】AndroidStudio(NDK)で作成したAARで、ライブラリのバッファに追加・クリアしてみる
目的
NDKで配布用に作成したAARに内部バッファを持たせて、溜め込んで色々と処理する為に追加とクリアをしてみます。
環境
統合環境:AndroidStudio 3.6.1
TargetSDK:26(Android8.0)
AAR(C++部分)
int配列で追加します。
10個までのバッファを持ち、超えたら先頭から消します。
バッファをクリアする関数も作成します。
#include <jni.h>
#include <string>
#include <vector>
#include <numeric>
std::vector<int> PintBuff; // JNI用バッファ
// バッファクリア
extern "C" JNIEXPORT void JNICALL
Java_s_test_jnibufferlib_JNIBufferLib_JNIClear(
JNIEnv *env, jobject
) {
PintBuff.clear();
}
// バッファに配列を加える
extern "C" JNIEXPORT jintArray JNICALL
Java_s_test_jnibufferlib_JNIBufferLib_JNIAdd(
JNIEnv *env, jobject,
jintArray intArray ) {
jint intInputSize = env->GetArrayLength(intArray); // 入力配列数の取得
jint *intArrayInput = env->GetIntArrayElements(intArray, 0); // 入力配列の取得
// 入力値を追加
for(int i = 0;i < intInputSize; i++){
PintBuff.push_back(intArrayInput[i]);
}
// バッファが10個を超えたら、先頭から消す
if(PintBuff.size() > 10){
int intErase = PintBuff.size() - 10; // 消す数
PintBuff.erase(PintBuff.begin(), PintBuff.begin() + intErase);
}
// バッファを出力する
int intOutPutSize = static_cast<int>(PintBuff.size()); // 出力する計測値の数
int intOuntput[intOutPutSize];
for(int i=0; i<intOutPutSize;i++){
intOuntput[i] = PintBuff[i];
}
jintArray intArrayOutput = env->NewIntArray(intOutPutSize); // 出力配列
env->SetIntArrayRegion(intArrayOutput, 0, intOutPutSize, intOuntput); // 出力をJNI用に変換
return intArrayOutput; // intの配列を返す
}
AAR(Java部分)
呼び出し部分だけです。
package s.test.jnibufferlib;
public class JNIBufferLib {
static {
System.loadLibrary("jnibufferlib"); // ライブラリ読み込み
}
public native int[] JNIAdd(int[] ints); // JNIへ値を入れ、バッファの中身を返す
public native void JNIClear(); // JNI内のバッファをクリアする
}
AARをimportして使用
作成したAARをインポートし、配列を追加してみます。
package s.test.jnibuffer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import java.util.Arrays;
import s.test.jnibufferlib.JNIBufferLib; // 作成したJNIライブラリの読み込み
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int[] intA = new int[]{ 1, 2, 3, 4}; // グループA
int[] intB = new int[]{ 5, 6, 7, 8}; // グループB
int[] intC = new int[]{ 9,10,11,12}; // グループC
JNIBufferLib libBuffer = new JNIBufferLib(); // JNIライブラリ(最大10個までのバッファ)
int[] intArr;
intArr = libBuffer.JNIAdd(intA); // グループAを追加
Log.d("Step1", Arrays.toString(intArr));
intArr = libBuffer.JNIAdd(intB); // グループBを追加
Log.d("Step2", Arrays.toString(intArr));
intArr = libBuffer.JNIAdd(intC); // グループCを追加(合計12個になるので先頭2個が消える)
Log.d("Step3", Arrays.toString(intArr));
libBuffer.JNIClear(); // ライブラリのバッファをクリアする
intArr = libBuffer.JNIAdd(intC); // グループCを追加(クリアされているので、グループCのみ表示)
Log.d("Step4", Arrays.toString(intArr));
}
}
出力結果
目的通りバッファに追加とクリアが出来ました。
D/Step1: [1, 2, 3, 4]
D/Step2: [1, 2, 3, 4, 5, 6, 7, 8]
D/Step3: [3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
D/Step4: [9, 10, 11, 12]
Author And Source
この問題について(【備忘録】AndroidStudio(NDK)で作成したAARで、ライブラリのバッファに追加・クリアしてみる), 我々は、より多くの情報をここで見つけました https://qiita.com/Wind/items/d6741d07bea9c086609a著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .