从NDK获取应用程序名称

Ser*_*awy 5 android android-ndk

我需要从本机端获取我的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);
Run Code Online (Sandbox Code Playgroud)

我的本机代码:

  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);
}
Run Code Online (Sandbox Code Playgroud)

我只是从java代码将活动传递给我的家乡methon.

我没有机会在java类中编写这个代码然后从我的NDK应用程序调用它我正在尝试将一个上下文对象作为jobject传递给我的本机代码,但它总是崩溃.剂量任何人都有任何想法吗?

Sev*_*yev 13

C中反映的Java访问是丑陋的,丑陋的,丑陋的,就像你已经证明的那样.将应用程序名称作为额外的字符串参数传递.

编辑:好的,你想要反射,反射你会得到.

您的本机方法属于类AnalyticToolActivity.作为非静态类方法,它this在每次调用时都有一个指针.与C++和Java方法不同,此指针显式传递为第二个参数.该方法有两个必需参数 - a JNIEnv *和a jobject.第二个对应于thisJava对象的指针.

因此,如果你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); 
Run Code Online (Sandbox Code Playgroud)

等等.


Sam*_*uel -4

为什么需要从 NDK 执行此操作?也许对我们来说,帮助您调试传递上下文对象的问题会更有用,然后您可以将应用程序名称作为字符串传递。