Truy cập ngữ cảnh android trong ứng dụng ndk

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

Có cách nào mà tôi có thể vượt qua / nhận được một đối tượng của bối cảnh android trong applk ndk của tôi. Tôi muốn sử dụng SharedPreferences trong ứng dụng ndk của tôi thông qua giao diện jni. Để có được một thể hiện của đối tượng getSharedPreferences() , tôi cần gọi getSharedPreferences() trên đối tượng Context . Nhưng tôi không có quyền truy cập vào đối tượng ngữ cảnh.

HOẶC LÀ

Làm thế nào tôi có thể đọc và viết một tập tin xml từ NDK?

Mọi con trỏ sẽ được đánh giá cao.

3 Comments
ognian 15/12/2010
Cách đọc và viết file xml: xmlsoft.org
Sebastian Roth 15/12/2010
Trong khi không có kinh nghiệm với NDK, tôi không nghĩ rằng bạn có thể truy cập vào bối cảnh. Phát triển NDK chỉ dành cho những thứ cấp thấp, hiệu suất cao và chỉ ở mức độ thấp. Tôi đề nghị bạn tìm thấy dữ liệu cấu hình quan trọng nhất mà bạn cần và viết nó ra dưới dạng JSON hoặc XML và phân tích nó từ mã NDK của bạn.
Mr.Cool 22/05/2013
@cppdev bây giờ tôi cũng phải đối mặt với cùng một vấn đề này, nếu bạn đã thực hiện điều này, bạn có thể chia sẻ

2 Answers


Lucas S. 22/12/2010.

Không có gì đặc biệt bạn phải làm, nó cũng giống như cơ chế JNI thông thường. Bạn cần lấy một con trỏ tới đối tượng ngữ cảnh, sau đó lấy ra ID phương thức bạn muốn gọi và sau đó gọi nó với các arg mà bạn muốn.

Tất nhiên trong các từ nó nghe có vẻ siêu đơn giản, nhưng trong mã nó thực sự lộn xộn kể từ khi tất cả các kiểm tra và các cuộc gọi JNI.

Vì vậy, theo ý kiến ​​của tôi, tôi sẽ không cố gắng thực hiện toàn bộ nội dung từ mã JNI / bản địa, thay vào đó tôi sẽ triển khai một phương thức trợ giúp trong Java để tạo tất cả nội dung và chỉ nhận dữ liệu cần thiết để đọc / ghi tùy chọn.

Điều đó sẽ đơn giản hóa rất nhiều mã nguồn gốc của bạn và nó sẽ làm cho nó dễ dàng hơn để duy trì.

ví dụ:

//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);
        }
    }
} 

Lưu ý rằng tôi chỉ viết mã từ bộ nhớ để mong đợi không làm việc ra khỏi hộp.

2 comments
Igor Ganapolsky 12/04/2016
Biến env là gì? Có phải là một bối cảnh được truyền trong Android?
1 aasu 08/09/2016
@IgorGanapolsky Nó không cần phải được thông qua một cách rõ ràng như một đối số trong lời gọi hàm JNI vì JVM trong nội bộ truyền nó. Xem en.wikipedia.org/wiki/Java_Native_Interface#How_the_JNI_work‌ s

dev 16/02/2016.

Có vẻ như mọi thứ đã thay đổi gần đây và giải pháp ở trên và vài người khác được đăng trên các bài đăng SO khác không hoạt động đối với tôi. Sau một vài lần thử, tôi đã có thể thực hiện các giải pháp sau. Mục tiêu của tôi là chuyển đối tượng Context tới JNI và nhận được đường dẫn lưu trữ tuyệt đối.

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 12/04/2016
Tôi nghĩ rằng các đối số đi ở vị trí cuối cùng trong danh sách tham số cho GetMethodID theo journals.ecs.soton.ac.uk/java/tutorial/native1.1/implementin‌ g /… . Tuy nhiên, bạn đang chuyển contextClass làm tham số đầu tiên?

Related questions

Hot questions

Language

Popular Tags