android - 从 NDK 获取应用程序名称

标签 android android-ndk

我需要像这样从 native 端获取我的 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);
}

我只是将 Activity 从 Java 代码传递到我的 native methon。

而且我没有机会在 java 类中编写这段代码,然后从我的 NDK 应用程序中调用它 我正在尝试将上下文对象作为 jobject 传递给我的 native 代码,但它总是崩溃。 有人知道吗?

最佳答案

C 中反射的 Java 访问是丑陋的,丑陋的,丑陋的,就像你所展示的那样。将应用名称作为额外的字符串参数传递。

编辑:好吧,你想要反射(reflection),你会得到反射(reflection)。

您的 native 方法属于类 AnalyticToolActivity .作为一个非静态类方法,它有一个 this每次通话的指针。与 C++ 和 Java 方法不同,此指针作为第二个参数显式传递。该方法有两个强制参数 - JNIEnv *和一个 jobject .第二个对应this Java 对象的指针。

因此,如果您的 AnalyticToolActivityActivity 的子类- 很有可能 - 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); 

等等。

关于android - 从 NDK 获取应用程序名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9982864/

相关文章:

java - 10.9.3 Android Studio 之后的 Mac 操作系统无法运行

iphone - 将 iPhone 3-D 游戏代码转换为在 Android 设备上运行的最佳方式?

安卓 OpenCV - "error: cannot find -lopencv_java"

java - 如何在eclipse项目aosp android中解析so文件映射

java - 获取触摸输入的 x 和 y 坐标(Android studio,Java)

JQuery Mobile native 选择不适用于机器人

java - Activity 和 Intent

java - Android:实现 ViewHolder

android - 添加日志时 CMakeLists.txt (target_link_libraries) 中的 CMake 错误

安卓 ndk(cmake) : 'undefined reference to ` __android_log_write' when using log api in the second jni library