Доступ к контексту android в приложении ndk

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

Есть ли способ, которым я могу передать / получить объект андроидного контекста в моем приложении ndk. Я хочу использовать SharedPreferences в приложении ndk через интерфейс jni. Чтобы получить экземпляр объекта SharedPreferences , мне нужно вызвать getSharedPreferences() для объекта Context . Но у меня нет доступа к объекту контекста.

ИЛИ

Как я могу читать и писать xml-файл из NDK?

Любые указатели будут оценены.

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. Вам нужно получить указатель на объект контекста, затем получить идентификатор метода, который вы хотите вызвать, а затем вызвать его с помощью требуемых аргументов.

Конечно, в словах это звучит супер просто, но в коде это становится очень грязным, поскольку все проверки и вызовы 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. Он не должен быть явно передан как аргумент в вызове функции JNI, потому что JVM внутренне передает его. См. En.wikipedia.org/wiki/Java_Native_Interface#How_the_JNI_work s

dev 02/16/2016.

Похоже, что в последнее время все изменилось, и решение выше и немногие другие, опубликованные на других сообщениях SO, не работало для меня. После нескольких попыток я смог сделать следующее решение. Моя цель состояла в том, чтобы передать объект контекста в 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
Я думал, что аргументы попадают в последнюю позицию в списке параметров для GetMethodID соответствии с журналами GetMethodID g / .... Однако вы передаете contextClass в качестве первого параметра?

Related questions

Hot questions

Language

Popular Tags