我需要从本机端获取我的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应用程序中调用它 我正在尝试将上下文对象作为jobject传递给我的本机代码,但它总是崩溃。 剂量任何人都有任何想法?
答案 0 :(得分:13)
C中反映的Java访问是丑陋的,丑陋的,丑陋的,就像你已经证明的那样。将应用名称作为额外的字符串参数传递。
编辑:好的,你想要反射,你会得到反射。
您的原生方法属于班级AnalyticToolActivity
。作为非静态类方法,它在每次调用时都有一个this
指针。与C ++和Java方法不同,此指针显式传递为第二个参数。该方法有两个必需参数 - JNIEnv *
和jobject
。第二个对应于Java对象的this
指针。
因此,如果您的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);
等等。
答案 1 :(得分:-3)
为什么你需要从NDK这样做?也许对我们来说,帮助您调试传递上下文对象的问题会更有用,然后您可以将应用程序名称作为字符串传递。