0

Android-ndk を使用してコンパイルされたネイティブ共有ライブラリがあります

C API 関数の 1 つを次に示します。

int load_config(const char *fn, Config *cfg)

関数をJNIでラップし、Javaから正常に呼び出しました。

Config cfg = new Config();
my_shared_lib.load_config("test.gcf", cfg);
System.out.println("cfg.rx_id = " + cfg.getRx_id());

これにより、Config データ構造から期待される値が出力されます。

しかし、Androidエミュレーターに移植したので、構成データのファイル名を表す文字列を処理する方法について混乱しています

$(PROJECT)/assets ディレクトリに test.gcf を追加してみました。

Config cfg = new Config();
my_shared_lib.load_config("assets/test.gcf", cfg);
outputText.append("cfg.rx_id = " + cfg.getRx_id());

しかし、これは機能しません。つまり、Config データ構造からの期待値が出力されません (空白になるだけです)。

つまり、ネイティブ ライブラリ関数がファイル名をパラメーターとして期待する場合、どうすればよいでしょうか?

4

1 に答える 1

1

アセットは、デバイスにもエミュレーターにもファイルとして保存されません。それらは ZIP アーカイブである APK に保存されます。C/C++ ファイル アクセス関数を使用しても機能しません。JNI コードからアセットにアクセスするには、AAssetManagerを使用します。

現在、設定ファイルはおそらくアセットに属していません。アセットは定義上、読み取り専用です。設定を変更可能にしたいですよね?Context.getDir()Android の書き込み可能なデータ フォルダーは、関数を介して Java 側で取得されます。そこからファイル名を派生させ、C 側に渡します。このようなもの:

File Path = Ctxt.getDir("MyData", 0);
File FileName = new File(Path, "test.gcf");
my_shared_lib.load_config(FileName.toString(), cfg); 

上記のフォルダーは、Android ファイルシステムの次のパスにマップされます: /data/data/com.mypackagename/app_MyData. アプリの SD カードへの移動が有効になっている場合は異なります。

既定の構成ファイルをアセットに同梱し、アプリの実行時にデータ フォルダーに書き込み可能にしておく場合は、最初の実行時にアセットからデータ フォルダーにコピーするだけです。例はこちら

于 2012-08-03T14:41:28.630 に答える