Note that there is an android-ndk Google Group for NDK-related questions.

On Wed, Oct 19, 2011 at 4:51 PM, BBB <[email protected]> wrote:
> Hi Everyone,
>
> I have an issue where (*env)->CallStaticVoidMethod is crashing. I am
> caching the jvm, class and method id on JNI_OnLoad. In JNI_OnLoad i
> start a thread! in that thread I want to call back a java method which
> I am having problems with. Also should I be using JNI_VERSION_1_2 or
> JNI_VERSION_1_4?
>
> JavaVM *cached_jvm;
> jclass Class_C;
> jmethodID MID_C_callback;
>
>
> JNIEXPORT jint JNICALL
> JNI_OnLoad(JavaVM *jvm, void *reserved)
> {
>        __android_log_print(ANDROID_LOG_DEBUG, "JNI_OnLoad",
>                        "JNI_OnLoad - start");
>
>        JNIEnv *env;
>        jclass cls;
>        // cache the jvm
>        cached_jvm = jvm;
>
>        if ((*jvm)->GetEnv(jvm, (void **)&env, JNI_VERSION_1_2)) {
>                __android_log_print(ANDROID_LOG_DEBUG, "JNI_OnLoad",
>                                "ERROR: GetEnv failed ");
>
>                return JNI_ERR; // JNI version not supported;
>        }
>
>        cls = (*env)->FindClass(env,
>                        "com/bla/bla/xxxActivity");
>
>        if (cls == NULL) {
>                __android_log_print(ANDROID_LOG_DEBUG, "JNI_OnLoad",
>                                "ERROR: FindClass failed");
>
>                return JNI_ERR;
>        }
>
>        /* Use weak global ref to allow C class to be unloaded */
>        Class_C = (*env)->NewWeakGlobalRef(env, cls);
>        if (Class_C == NULL) {
>                __android_log_print(ANDROID_LOG_DEBUG, "JNI_OnLoad",
>                                "ERROR; NewWeakGlobalRef failed ");
>
>                return JNI_ERR;
>        }
>
>        /* Compute and cache the method ID */
>        MID_C_callback = (*env)->GetStaticMethodID(env, cls, "callback",
> "()V");
>        if (MID_C_callback == NULL) {
>                __android_log_print(ANDROID_LOG_DEBUG, "JNI_OnLoad",
>                                                "ERROR:GetStaticMethod failed 
> ");
>                return JNI_ERR;
>        }
>
>        startMyThread();
>
>        return JNI_VERSION_1_2;
> }
>
> void startMyThread()
> {
>        pthread_t myThread;
>        int rc;
>        rc = pthread_create(&myThread, NULL, (void *) &workerFunction, NULL);
>        if (rc) {
>                __android_log_print(ANDROID_LOG_DEBUG, GENERAL_LOG,
>                                "ERROR starting pulse detection thread ");
>        }
> }
>
> static void workerFunction()
> {
>        JNIEnv *env;
>        int status = (*cached_jvm)->AttachCurrentThread(cached_jvm, &env,
> NULL);
>        // status is 0 which means success
>        (*env)->CallStaticVoidMethod(env, Class_C, MID_C_callback); //
> this crashes
>
> }
>
> --
> You received this message because you are subscribed to the Google
> Groups "Android Developers" group.
> To post to this group, send email to [email protected]
> To unsubscribe from this group, send email to
> [email protected]
> For more options, visit this group at
> http://groups.google.com/group/android-developers?hl=en
>



-- 
Mark Murphy (a Commons Guy)
http://commonsware.com | http://github.com/commonsguy
http://commonsware.com/blog | http://twitter.com/commonsguy

_Android Programming Tutorials_ Version 4.0 Available!

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to