Android : c ++ NDK에서 공유 환경 설정 객체를 생성하고 불리언 값을 저장해야합니다.

Amjad Khan 07/29/2017. 3 answers, 887 views
java android android c++ android-ndk android-ndk jni

나는이 일을 시작하는 법을 모른다.

Android.mk를 사용하여 C ++에 링크 된 프로젝트를 만들었습니다.

그래서 자바에서 메소드를 호출하면 공유 환경 설정 객체에 저장하는 부울 값을 저장해야합니다.

이것이 나의 JNI 방법이다.

extern "C"
JNIEXPORT void JNICALL
Java_com_example_sample_storeBoolean(JNIEnv *env,jobject instance){
//TODO 
const char *name ="hello";
__android_log_print(ANDROID_LOG_ERROR, "TRACKERS", "***** %s *****", name);
} 

일반 로그 나는 그것이 지금은 단지 sharepreference 개체를 만들고 부울 값을 설정해야합니다 일하고있다 인쇄했습니다

SharedPreferences prefs = context.getSharedPreferences("myprefdata", Context.MODE_PRIVATE);

prefs.edit().putBoolean("settingnootification", true).commit(); 

어떻게하는지 안내해주세요. 감사

public abstract SharedPreferences getSharedPreferences(String name, int mode); 

C ++에서이 메서드를 사용해야합니다.

3 Answers


vikas kumar 08/05/2017.

JNI의 MainActivity에서 saveBoolean(boolean bool) 을 호출하고 값을 저장했습니다. 다음은 코드입니다 : MainActivity

public class MainActivity extends AppCompatActivity {

// Used to load the 'native-lib' library on application startup.
static {
    System.loadLibrary("native-lib");
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    stringFromJNI(this);
}

/**
 * A native method that is implemented by the 'native-lib' native library,
 * which is packaged with this application.
 */
public native void stringFromJNI(MainActivity mainActivity);

public void saveBoolean(boolean bool){
    SharedPreferences sharedPreferences = this.getSharedPreferences("Test", Context.MODE_PRIVATE);
    sharedPreferences.edit().putBoolean("testBool",bool).commit();
    Log.d("MainActivity","saveBoolean Called "+bool);
} 

}

#include #include extern "C"
JNIEXPORT void JNICALL
Java_com_android_techgig_sharedpref_MainActivity_stringFromJNI(JNIEnv *env,jobject  obj /* this */) {

    jclass cls = (env)->GetObjectClass(obj); //for getting class
    jmethodID mid = (env)->GetMethodID(cls, "saveBoolean", "(Z)V"); //for getting method signature, Z for boolean
    if (mid == 0)
        return;
    //will return 0 in case of class not found
    (env)->CallVoidMethod(obj, mid, true); //now calling actual method
    printf("native called");
} 

다음은 메소드 서명 유형입니다.

Signature   Java Type
Z   boolean
B   byte
C   char
S   short
I   int
J   long
F   float
D   double 

더 많은 것을 탐구하는 링크는 여기있다 ..

해피 코딩 !!!


mko 07/31/2017.

코드에서 Java 클래스를 호출하고 싶습니다. Java를 C ++ 코드에서 다시 호출하는 것이 좋습니다.

여기 좀보세요 :

https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo032

이 샘플에서 수행 할 작업은 다음과 같습니다.

  • 자바는 C ++을 호출한다.
  • Java에서 전달 된 정보를 기반으로 C ++가 JVM에 연결됩니다.
  • C ++ 코드는 다른 클래스의 자바 코드를 호출합니다 (귀하의 경우 SharedPreferences 객체가 될 것입니다)

일을 더 간단하게하기 위해서 어떤 도움이되는 수업이 필요할지도 모릅니다. 예 : PreferencesStorer - 적절한 환경 설정 클래스를 가져오고 저장할 값을 전달합니다.

여기 좀보세요 :

public static int fun() {
  System.out.println("From JVM");
  return 0;
} 

이것은 호출하고자하는 메소드이지만 store (String value, int mode)가되기를 원합니다.

귀하의 코드 (자바) 에서이 개체를 생성하고 C ++ 코드에 인수로 전달해야합니다. C ++ 내부에서이 객체의 메소드를 호출하려고합니다. JVM 내부에는 이미 호출 될 준비가되어있을 것입니다.

이것이 당신이 찾고자하는 것이 아니라면, 전체 유스 케이스를 좀 더 명확하게하기 위해 좀 더 많은 정보를 제공해야한다고 생각합니다.

JNI와 즐겁게 지내십시오.


Amjad Khan 09/06/2017.

getSharedPreferences () 메서드를 호출해야합니다. 그래서 어떻게 부를 수 있고 boolean을 저장할 수 있습니다.

따라서 NDK C ++에서 부울 값을 저장하고 검색하는 두 가지 간단한 방법을 만들었습니다.

MainActivity.java

public class MainActivity extends Activity {
    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("Native");
    }
    private Activity activity;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        activity=MainActivity.this;
        setStoreBoolValues(activity, true);

        if (getStoreValues(activity))
            Log.e("Store Value", " ** true **");
        else
            Log.e("Store Value", " ** false **");
    }

    public native boolean getStoreValues(Activity activity);
    public native void setStoreBoolValues(Activity activity, boolean flag);
} 

MainActivity에서 선언 된 네이티브 메서드 및 .so 파일이라고도 함

NativeClass.Cpp

jobject mainClass;

jstring spname(JNIEnv *env) {
    return env->NewStringUTF("sharedstore");
}

jstring objectname(JNIEnv *env) {
    return env->NewStringUTF("boolvaluestore");
}

extern "C"
JNIEXPORT jboolean JNICALL
Java_com_ebizzinfotech_amjad_contentresolverproj_MainActivity_getStoreValues(JNIEnv *env,
                                                                             jobject instance,
                                                                             jobject activity) {

    jclass spcls = env->FindClass("android/content/SharedPreferences");
    jclass contextcls = env->FindClass("android/content/Context");
    mainClass = env->NewGlobalRef(activity);
    jmethodID mid = env->GetMethodID(contextcls, "getSharedPreferences",
                                     "(Ljava/lang/String;I)Landroid/content/SharedPreferences;");
    jmethodID midbool = env->GetMethodID(spcls, "getBoolean",
                                         "(Ljava/lang/String;Z)Z");
    jobject jobjectshared = env->CallObjectMethod(mainClass, mid, spname(env), 0);
//    jobject jobjectsharededit  = env->CallObjectMethod(jobjectshared,midedit);
    jboolean jboolean1 = env->CallBooleanMethod(jobjectshared, midbool,objectname(env), JNI_FALSE);

    env->DeleteLocalRef(spcls);
    env->DeleteLocalRef(contextcls);
    return jboolean1;
}


extern "C"
JNIEXPORT void JNICALL
Java_com_ebizzinfotech_amjad_contentresolverproj_MainActivity_setStoreBoolValues(JNIEnv *env,
                                                                                 jobject instance,
                                                                                 jobject activity,
                                                                                 jboolean flag) {
    jclass spcls = env->FindClass("android/content/SharedPreferences");
    jclass speditorcls = env->FindClass("android/content/SharedPreferences$Editor");
    jclass contextcls = env->FindClass("android/content/Context");

    mainClass = env->NewGlobalRef(activity);

    jmethodID mid = env->GetMethodID(contextcls, "getSharedPreferences",
                                     "(Ljava/lang/String;I)Landroid/content/SharedPreferences;");

    jmethodID midedit = env->GetMethodID(spcls, "edit",
                                         "()Landroid/content/SharedPreferences$Editor;");

    jmethodID midputbool = env->GetMethodID(speditorcls, "putBoolean",
                                            "(Ljava/lang/String;Z)Landroid/content/SharedPreferences$Editor;");

    jmethodID midapply = env->GetMethodID(speditorcls, "apply",
                                          "()V");
    jobject jobjectshared = env->CallObjectMethod(mainClass, mid,spname(env), 0);
    jobject jobjectsharededit = env->CallObjectMethod(jobjectshared, midedit);
    env->CallVoidMethod(env->CallObjectMethod(jobjectsharededit, midputbool, objectname(env), flag),
                        midapply);
    env->DeleteLocalRef(spcls);
    env->DeleteLocalRef(contextcls);
    env->DeleteLocalRef(speditorcls);
} 

Related questions

Hot questions

Language

Popular Tags