получить имя приложения от NDK - PullRequest
5 голосов
/ 02 апреля 2012

Мне нужно получить имя моего приложения для Android с родной стороны, например, вот так:

 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);

мой родной код вот так:

  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);
}

и я просто пропускаю действиена мой родной метон из кода Java.

и у меня нет возможности написать этот код в классе Java, а затем вызвать его из моего приложения NDK. Я много пытаюсь передать объект контекста как объект заданиямой родной код, но он всегда вылетаетдоза кто-нибудь есть идеи?

Ответы [ 2 ]

13 голосов
/ 03 апреля 2012

Отраженный доступ к Java в C безобразен, безобразен, безобразен, как вы продемонстрировали. Передайте имя приложения в качестве дополнительного строкового параметра.

РЕДАКТИРОВАТЬ: ОК, вы хотите отражение, отражение вы получите.

Ваш нативный метод принадлежит классу AnalyticToolActivity. Как нестатический метод класса, он имеет указатель this на каждый вызов. В отличие от методов C ++ и Java, этот указатель передается явно как второй параметр. Метод имеет два обязательных параметра - JNIEnv * и jobject. Второй соответствует указателю this объекта Java.

Так что, если ваш AnalyticToolActivity является подклассом Activity - вполне вероятно, - параметр entryObject является экземпляром Activity, то есть это экземпляр Context. Так что избавьтесь от третьего параметра (contxt), и ваш код JNI может выглядеть так:

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); 

и пр.

0 голосов
/ 03 апреля 2012

Зачем вам это нужно из NDK? Возможно, для нас было бы более полезно помочь вам отладить проблему, передавая объект контекста, и тогда вы могли бы просто передать имя приложения в виде строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...