2010-11-23 11 views
3

J'ai une méthode en JNI (C++) et je veux être capable de retourner un type d'objet personnalisé (pas une primitive ou une chaîne etc ...) J'ai écrit quelque chose mais je continue d'obtenir java.lang. Erreur UnsatisfiedLinkError.Comment définir un type de retour pour une méthode JNI avec une classe Object personnalisée?

Voici les détails:

La méthode:

static jobject Java_android_sdk_Core_ProcessFrame(JNIEnv *env, jobject myobj, jbyteArray frameData) 
    { 

    jclass clazz; 
    jmethodID cid; 
    jobject jCoreOut; 
    static const char* const strClassName = "android/sdk/Core/CoreOutput"; 
    clazz = env->FindClass(strClassName); 
    if (clazz == NULL) { 
     LOGE("Can't find class CoreOutput"); 

    } 
    cid = env->GetMethodID(clazz,"<init>", "()V"); 
    jCoreOut = env->NewObject(clazz, cid); 


    // Free local references 
     env->DeleteLocalRef(clazz); 

    return jCoreOut; 

    } 

Je les descripteurs de méthodes définies de la façon suivante:

static const JNINativeMethod gMethods[] = { 
     { "CreateCore", "(III)V", (void*) Java_android_sdk_Core_CreateCore }, 
    { "ProcessFrame", "([B)Landroid/sdk/Core/CoreOutput;", (void*) Java_android_sdk_Core_ProcessFrame } 
}; 

Je suis d'effectuer l'enregistrement de la méthode en appelant sur:

 if (env->RegisterNatives(clazz, gMethods, 
    sizeof(gMethods)/sizeof(gMethods[0])) != JNI_OK) 
{ 
    LOGE("Failed registering JNI methods"); 
    return result; 
} 

Et l'enregistrement pour mes autres méthodes natives est réussi. (Je suis en mesure de les utiliser ...)

Lorsque je tente d'appeler la méthode ProcessFrame je reçois la sortie suivante de Logcat:

11-23 16:10:10.139: ERROR/AndroidRuntime(4923): java.lang.UnsatisfiedLinkError: ProcessFrame 

Je suis sûr qu'il a quelque chose à voir avec moi ne pas définir la méthode correctement. Quelqu'un peut-il nous éclairer là-dessus?

Quelqu'un peut-il me diriger vers un bon tutoriel qui couvre plus de la manipulation des types primitifs dans JNI?

Merci,

Itamar

+0

J'ai trouvé la raison de l'UnsatisfiedLinkError. Apparemment, le fait que j'essayais de retourner un type qui était défini comme une classe interne de Core était le problème. Une fois que j'ai déplacé la définition CoreOutput dans son propre fichier de classe, cela a fonctionné. Est-ce que quelqu'un sait comment une classe interne peut être retournée dans cette situation? – Ita

Répondre

1

UnsatisfiedLinkError est levée lorsque la machine virtuelle Java ne peut pas trouver la méthode. Cela a donc à voir avec votre déclaration de méthode. Regardez dans javah pour créer l'en-tête de fonction pour vous. Regardez dans ceci: javah

+0

J'ai essayé d'utiliser javah et ça a donné le même résultat que la signature que j'ai trouvée ... Il doit y avoir quelque chose qui me manque ... – Ita