ndk 응용 프로그램의 안드로이드 컨텍스트 액세스

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

내 ndk appliation에서 안드로이드 컨텍스트의 객체를 전달 / 전달할 수있는 방법이 있습니까? 내 ndk 응용 프로그램에서 SharedPreferences 를 jni 인터페이스를 통해 사용하고 싶습니다. 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로 호출해야합니다.

물론 단어로는 매우 간단하게 들리지만 코드에서는 모든 검사와 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 게시물에 게시 된 다른 사람이 나를 위해 맞지 않는 것처럼 보입니다. 몇 번 시도한 후에 나는 다음 솔루션 작업을 할 수있었습니다. 내 목표는 컨텍스트 개체를 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/java/tutorial/native1.1/implementin g / ... 에 따라 GetMethodID 매개 변수 목록에서 마지막 위치에 있다고 생각했습니다. 그러나 contextClass 를 첫 번째 매개 변수로 전달하고 있습니까?

Related questions

Hot questions

Language

Popular Tags