ndkアプリケーションのアンドロイドコンテキストへのアクセス

cppdev 12/15/2010. 2 answers, 7.899 views
android android android-ndk android-ndk

ndk appliationでアンドロイド・コンテキストのオブジェクトを渡す/取得する方法はありますか? 私は、jniインターフェイス経由で自分のndkアプリケーションでSharedPreferencesを使いたいと思っています。 SharedPreferencesオブジェクトのインスタンスを取得するには、 ContextオブジェクトでgetSharedPreferences()を呼び出す必要があります。 しかし、私はコンテキストオブジェクトにアクセスすることはできません。

または

NDKからxmlファイルを読み書きするにはどうすればよいですか?

すべてのポインタが評価されます。

3 Comments
ognian 12/15/2010
xmlファイルの読み書き方法: xmlsoft.org
Sebastian Roth 12/15/2010
NDKの経験はありませんが、私はあなたがその文脈にアクセスできるとは思いません。 NDKの開発は、タイムクリティカルな、高性能の、低レベルのものだけを対象としています。 必要な最も重要な設定データを見つけ出し、JSONまたはXMLで書き出し、NDKコードから解析することをお勧めします。
Mr.Cool 05/22/2013
あなたがこれを実装している場合、@ cppdev今も私はこの同じ問題に直面している、あなたは共有することができます

2 Answers


Lucas S. 12/22/2010.

特別なことは何もありません。通常のJNIメカニズムと同じです。 コンテキストオブジェクトへのポインタを取得し、呼び出すメソッドIDを取得し、必要なargsで呼び出すメソッドIDを取得する必要があります。

言葉で言えば、それは非常に簡単ですが、コードではすべてのチェックとJNI呼び出しの後に本当に面倒になります。

したがって、私はネイティブ/ JNIコードからすべてを実装しようとはしませんが、代わりにJavaでヘルパーメソッドを実装して、すべてのものを作成し、必要なデータを読み書きするだけです。

これにより、ネイティブコードが大幅に単純化され、メンテナンスが容易になります。

例えば:

//Somewhere inside a function in your native code
void Java_com_example_native_MainActivity_nativeFunction(JNIEnv* env, jobject thiz)
{
    jclass cls = (*env)->FindClass(env,"PreferenceHelper");
    if (cls == 0) printf("Sorry, I can't find the class");

    jmethodID set_preference_method_id;

    if(cls != NULL)
    {
        set_preference_method_id = (*env)->GetStaticMethodID(env, cls, "setPreference", "(Ljava/lang/String;Ljava/lang/StringV");

        if(set_preference_method_id != NULL )
        {
            jstring preference_name = (*env)->NewStringUTF(env, "some_preference_name");
            jstring value = (*env)->NewStringUTF(env, "value_for_preference");

            (*env)->CallStaticVoidMethod(env, cls, get_main_id, preference_name, value);
        }
    }
} 

私はちょうどメモリからコードを書いたので、箱から出てこないことを期待していることに注意してください。

2 comments
Igor Ganapolsky 04/12/2016
env変数とは何ですか? は、Androidで渡されるコンテキストですか?
1 aasu 09/08/2016
@IgorGanapolsky JVMが内部的に渡すので、JNI関数呼び出しで引数として明示的に渡す必要はありません。 en.wikipedia.org/wiki/Java_Native_Interface#How_the_JNI_workを参照してください。

dev 02/16/2016.

最近の変更があり、上記の解決策や他のSOの投稿に掲載された解決策は私にとってはうまくいきませんでした。 数回の試行の後、私は以下のソリューション作業を行うことができました。 私の目標は、Context ObjectをJNIに渡し、絶対的なストレージパスを取得することでした。

void Java_com_path_to_my_class_jniInit(JNIEnv* env, jobject thiz, jobject contextObject) {

    try {
         //Get Context Class descriptor
         jclass contextClass = env->FindClass("android/content/Context");
         //Get methodId from Context class
         jmethodID getFilesDirMethodId = env->GetMethodID(contextClass,"getFilesDir","()Ljava/io/File;");

         //Call method on Context object which is passed in
         jobject fileObject = env->CallObjectMethod(contextObject,getFilesDirMethodId);

         //Get File class descriptor
         jclass fileClass = env->FindClass("java/io/File");
         //Get handle to the method that is to be called
         jmethodID absolutePathMethodId = env->GetMethodID(fileClass,"getAbsolutePath","()Ljava/lang/String;");
         //Call the method using fileObject
         jstring stringObject = (jstring)env->CallObjectMethod(fileObject,absolutePathMethodId);
      }
      catch(exception& ex){
            JNIExceptionHelper::throwException(env, ex.what());
            return;
      }
} 
1 comments
Igor Ganapolsky 04/12/2016
引数は、 journals.ecs.soton.ac.uk/ GetMethodID / GetMethodID / GetMethodID / GetMethodID g / ...に従ってGetMethodIDパラメータリストの最後の位置にあると考えました。 しかし、最初のパラメータとしてcontextClasscontextClassていますか?

Related questions

Hot questions

Language

Popular Tags