2012-04-02 8 views
5

ho bisogno di ottenere il nome della mia applicazione Android dal somethin lato nativo del genere:ottenere il nome dell'applicazione da NDK

android.content.context context=(android.content.context) this;//current activiy 
Resources appR =context.getResources(); 
String packageName=context.getPackageName(); 
int id=appR.getIdentifier("app_name","string",packageName); 
CharSequence txt = appR.getText(id); 

mio codice nativo del genere:

jstring Java_com_AnalyticToolC_AnalyticToolActivity_JNISendData(JNIEnv* env,jobject entryObject,jobject contxt) 
{ 

    char *realAppName; 
realAppName=(char *)malloc(16 * 1024); 
jclass android_content_Context =(*env)->GetObjectClass(env, contxt); 
    jmethodID midGetPackageName = (*env)->GetMethodID(env, android_content_Context, "getPackageName", "()Ljava/lang/String"); 
jstring packageName=(*env)->CallObjectMethod(env, contxt, midGetPackageName); 
jmethodID midGetResources = (*env)->GetMethodID(env, android_content_Context, "getResources", "()L"); 
    jobject jResource=(*env)->CallObjectMethod(env, context, midGetResources); 

    jclass resource_Class=(*env)->GetObjectClass(env, jResource); 
    jmethodID midGetIdentifier = (*env)->GetMethodID(env, resource_Class, "getIdentifier", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String)I"); 
    jstring app_name=(*env)->NewStringUTF(env,"app_name"); 
    jstring TypeName=(*env)->NewStringUTF(env,"string"); 
    int id=(*env)->CallObjectMethod(env, jResource, midGetIdentifier,app_name,TypeName,packageName); 

    jmethodID midGetAppName = (*env)->GetMethodID(env, resource_Class,"getText","(I)Ljava/lang/String"); 
    jstring appName=(*env)->CallObjectMethod(env, jResource, midGetAppName,id); 

    realAppName=(*env)->GetStringUTFChars(env, appName, NULL); 
} 

e ho appena passare il attività al mio methon nativo dal codice java.

e non ho la possibilità di scrivere questo codice nella classe java, quindi chiamarlo dalla mia applicazione NDK Sto provando molto a passare un oggetto di contesto come jobject al mio codice nativo ma si blocca sempre. dose qualcuno ha qualche idea?

+0

il tuo problema è "() Ljava/lang/String". Dovresti usare questo "() Ljava/lang/String;" –

+0

[il modo più semplice] (http://stackoverflow.com/a/6284443/192373) è di leggere '/ proc/MyPID/cmdline'. –

+0

Rilevante http://pt.stackoverflow.com/q/145869/8984 – Florida

risposta

-3

Perché è necessario farlo dall'NDK? Forse sarebbe più utile per noi aiutarvi a risolvere il problema passando un oggetto di contesto, e quindi potreste semplicemente passare il nome dell'app come una stringa.

+0

lo faccio perché ho un mio C lib che userà da un'altra applicazione nativa quindi ho bisogno di usare il nome dell'applicazione nel mio C lib, comunque io aggiornerà la domanda con il mio codice nativo. – Serngawy

13

L'accesso a Java riflesso in C è brutto, brutto, brutto, proprio come hai dimostrato. Passa il nome dell'app come parametro stringa extra.

MODIFICA: OK, vuoi la riflessione, il riflesso che otterrai.

Il metodo nativo appartiene alla classe AnalyticToolActivity. Come metodo di classe nonstatica, ha un puntatore this su ogni chiamata. A differenza dei metodi C++ e Java, questo puntatore viene passato esplicitamente come secondo parametro. Il metodo ha due parametri obbligatori: uno JNIEnv * e uno jobject. Il secondo corrisponde al puntatore this dell'oggetto Java.

Quindi, se il vostro AnalyticToolActivity è una sottoclasse di Activity - molto probabilmente - il parametro entryObject è un'istanza di Activity, che significa che è un esempio di Context. Così sbarazzarsi del terzo parametro (contxt), e il codice JNI può andare in questo modo:

jclass android_content_Context =(*env)->GetObjectClass(env, entryObject); 
//or use FindClass 

jmethodID midGetPackageName = (*env)->GetMethodID(env, 
    android_content_Context, 
    "getPackageName", 
    "()Ljava/lang/String;"); 

jstring packageName=(*env)->CallObjectMethod(env, entryObject, midGetPackageName); 

e così via.

+0

+1 per aver detto la stessa cosa di me – Samuel

+0

Lo so che è brutto, brutto così brutto ma questo è il caso, ho bisogno di accedere anche all'oggetto SharedPreferences, se qualcuno può aiutare ho davvero apprezzato – Serngawy

+0

Wording suggerisce che il tuo metodo nativo appartiene al tuo classe di attività. L'attività * è * una sottoclasse di contesto. Se il tuo metodo nativo è statico, rimuovilo; quindi considera il puntatore 'this' (AKA' entryObject') come riferimento di contesto. –

Problemi correlati