3

アプリで読み取る必要がある2つの永続的な値が必要なAndroidアプリを作成しています。アプリは、「どこかに」保存され、アクティビティが起動されるたびに取得される必要があるカウンターを維持する必要があります。その後、カウンターが更新され、Activity がシャットダウンされる前に保存されます。

重要な点は、カウンターの格納と取得をコードの JNI 部分で行うことです。Javaコードからは実質的に見えないはずです..このカウンター(メモリ)はJNIを使​​用してアクセスできますか?もしそうなら、私が見なければならないAPIを教えてもらえますか? Java 側で SQLiteDatabase を使用できることはわかっています。お知らせ下さい!

4

2 に答える 2

4

完全に可能ですが、Java コードがなければできません。

EDIT : 以下は、データベースの代替として提供されます。ネイティブ コードから永続的なデータをファイルに読み書きできると、データベースよりもはるかに柔軟になります...

ファイルシステムに存在するファイル (バイナリまたはプレーンテキスト) からデータを保存および取得する場合、次の手順を実行します。

  1. JAVA : アプリの保存場所を取得し、読み取りと書き込みが可能かどうかを確認します

  2. JAVA : 上記が正の場合、JNI を介してネイティブ層に渡します

  3. NATIVE : ストレージ パラメータを使用してファイルの読み取り/書き込みを行います

わかりました、ここまでは要約です。コードに行きましょう:

1A) ストレージの取得とチェック:

private boolean checkExternalStorageState(){
        String state = Environment.getExternalStorageState();

        if (Environment.MEDIA_MOUNTED.equals(state)) {
            // We can read and write the media
            android.util.Log.i("YourActivity", "External storage is available for read/write...", null);
            return true;
        } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
            // We can only read the media : NOT ok
            android.util.Log.e("YourActivity", "External storage is read only...", null);
            return false;
        } else {
            // Something else is wrong. It may be one of many other states, but all we need
            //  to know is we can neither read nor write
            android.util.Log.e("YourActivity", "External storage is not mounted or read only...", null);
            return false;
        }
    }

保管場所を取得します。

private get storageLocation(){
    File externalAppDir = getExternalFilesDir(null);
    String storagePath = externalAppDir.getAbsolutePath()
}

1B) ファイルが存在するかどうかを確認することもできます (これはネイティブ部分でも実行できます)。

private boolean fileExists(String file) {

        String filePath = storagePath + "/" + file;

        // see if our file exists
        File dataFile = new File(filePath);
        if(dataFile.exists() && dataFile.isFile())
        {
            // file exists
            return true;
        }
        else
        {
            // file does not exist
            return false;
        }
    }

2) ネイティブ レイヤーに渡します。

Java 部分:

// Wrapper for native library
public class YourNativeLib {


     static {
         // load required libs here
         System.loadLibrary("yournativelib");
     }

     public static native long initGlobalStorage(String storagePath);
     ...enter more functions here

}

ネイティブ部分:

JNIEXPORT jlong JNICALL Java_com_whatever_YourNativeLib_initGlobalStorage(JNIEnv *env, jobject obj, jstring storagePath)
{
    jlong data = 0;

    // convert strings
    const char *myStoragePath = env->GetStringUTFChars(storagepath, 0);
    // and now you can use "myStoragePath" to read/write files in c/c++

    //release strings
    env->ReleaseStringUTFChars(storagePath, myStoragePath);

    return data;
}

c/c++ でバイナリ ファイルまたはテキスト ファイルを読み書きする方法は十分に文書化されています。それはあなたに任せます。

于 2013-05-31T14:02:35.457 に答える