native methode



  • hallo
    ich bekomme folgende fehlermeldung

    print.cpp(7) : error C2819: Der Typ 'JNIEnv' hat keinen ueberladenen Elementoperator '->'
    d:\programme\jbuilder8\jdk1.4\include\jni.h(750) : Siehe Deklaration von 'JNIEnv_'
    c:\print.cpp(7) : error C2227: Der linke Teil von '->GetStringUTFChars' muss auf Klasse/Struktur/Union zeigen
    Fehler beim Ausführen von cl.exe.

    ich versuche von java aus folgende native methode aufzurufen.

    #include<stdio.h>
    #include"Print.h"
    
    JNIEXPORT void JNICALL Java_aufgabe2_Print_printString
    (JNIEnv *env, jclass, jstring s){
        jboolean isCopy;
        const char *str = (*env)-> GetStringUTFChars(env,s,&isCopy);
    
        printf("%s\n",str);
    }
    

    danke für die hilfe



  • hab noch den einen teil aus dem jni.h hierher kopiert

    /*
     * We use inlined functions for C++ so that programmers can write:
     *
     *    env->FindClass("java/lang/String")
     *
     * in C++ rather than:
     *
     *    (*env)->FindClass(env, "java/lang/String")
     *
     * in C.
     */
    
    struct JNIEnv_ {
        const struct JNINativeInterface_ *functions;
    #ifdef __cplusplus
    
        jint GetVersion() {
            return functions->GetVersion(this);
        }
        jclass DefineClass(const char *name, jobject loader, const jbyte *buf,
                   jsize len) {
            return functions->DefineClass(this, name, loader, buf, len);
        }
        jclass FindClass(const char *name) {
            return functions->FindClass(this, name);
        }
    
    .
    .
    .
    
      const char* GetStringUTFChars(jstring str, jboolean *isCopy) {
            return functions->GetStringUTFChars(this,str,isCopy);
        }
    .
    .
    .
    


  • hallo es klappt.
    so gehts

    env->FindClass("java/lang/String")

    und so nicht

    (*env)->FindClass(env, "java/lang/String")



  • env->FindClass("java/lang/String")

    und so nicht

    (*env)->FindClass(env, "java/lang/String")

    Das ist auch klar.
    Das Äquivalent zu

    env->FindClass("java/lang/String")
    

    ist:

    (*env).FindClass("java/lang/String")
    

    nicht:

    (*env)->FindClass(env, "java/lang/String")
    

Anmelden zum Antworten