Java Android NDK,如何将上下文传递到本机代码?使用哪种类型?
我是JNI的新手。在我的android项目中,我有一个java类,它声明了一个本机函数:Java Android NDK,如何将上下文传递到本机代码?使用哪种类型?,java,android,android-ndk,java-native-interface,Java,Android,Android Ndk,Java Native Interface,我是JNI的新手。在我的android项目中,我有一个java类,它声明了一个本机函数: public class MyService extends Service { … public int onStartCommand(Intent intent, int flags, int startId){ … doIt(getApplicationContext(), "test"); } public nativ
public class MyService extends Service {
…
public int onStartCommand(Intent intent, int flags, int startId){
…
doIt(getApplicationContext(), "test");
}
public native boolean doIt(Context context, String name);
static
{
System.loadLibrary("myNativelib");
}
}
如上所述,我希望本机函数采用两个参数,一个是Android应用程序的Context
,一个是String
在JNI本机代码中,我知道对于javaString
,我应该使用typejString
,但是如何将上下文传递给本机代码呢
我需要在我的本机代码中键入
Context
,因为我的本机代码稍后将调用带有Context
作为参数的java代码。它只是一个java对象,所以jobject可以正常工作。您需要查找类和方法才能使用它
像这样的事情应该可以做到:
JNIEXPORT void JNICALL Java_org_yourclass_yourNativeMethod(JNIEnv *env, jclass cls, jobject obj) {
jclass Context_class = (*env)->FindClass(env, "android/content/Context");
jmethodID Check_id = (*env)->GetMethodID(env, Context_class, "checkCallingOrSelfPermission", "(Ljava/lang/String;)V");
jint i = (*env)->CallIntMethod(env, obj, Check_id, (*env)->NewStringUTF("android.permission.WRITE_EXTERNAL_STORAGE"));
}
它只是一个Java对象,所以jobject可以正常工作。您需要查找类和方法才能使用它 像这样的事情应该可以做到:
JNIEXPORT void JNICALL Java_org_yourclass_yourNativeMethod(JNIEnv *env, jclass cls, jobject obj) {
jclass Context_class = (*env)->FindClass(env, "android/content/Context");
jmethodID Check_id = (*env)->GetMethodID(env, Context_class, "checkCallingOrSelfPermission", "(Ljava/lang/String;)V");
jint i = (*env)->CallIntMethod(env, obj, Check_id, (*env)->NewStringUTF("android.permission.WRITE_EXTERNAL_STORAGE"));
}
虽然可以从候选重复问题中找出答案,但实际上它并没有问同样的问题,也没有像Alex Barker的“它只是一个Java对象,所以jobject可以很好地工作”那样提供一个清晰和直接适用的解决方案下面的答案。虽然可以从候选的重复问题中找出答案,但它实际上并没有问同样的问题,也没有像Alex Barker的“它只是一个Java对象,所以jobject可以很好地工作”那样提供一个清晰和直接适用的解决方案。下面的答案。但是如何获得上下文呢?我需要的是一种获取上下文的方法。我理解,通过您的回答,我可以找到上下文类并调用其方法。但是你的代码只是展示了CallIntMethod,如何调用方法来获取上下文???对不起,我的印象是你正在将上下文传递给你的本地方法。这就是您的示例所建议的:公共本机布尔doIt(上下文上下文,字符串名称),它将生成方法签名JNIEXPORT jboolean JNICALL Java_MyService_doIt(JNIEnv*env,jclass cls,jobject Context,jstring name);我不熟悉如何使用Java获取上下文对象。一般的想法是对提供该方法的jobject调用getApplicationContext(),但是如何获取上下文呢?我需要的是一种获取上下文的方法。我理解,通过您的回答,我可以找到上下文类并调用其方法。但是你的代码只是展示了CallIntMethod,如何调用方法来获取上下文???对不起,我的印象是你正在将上下文传递给你的本地方法。这就是您的示例所建议的:公共本机布尔doIt(上下文上下文,字符串名称),它将生成方法签名JNIEXPORT jboolean JNICALL Java_MyService_doIt(JNIEnv*env,jclass cls,jobject Context,jstring name);我不熟悉如何使用Java获取上下文对象。一般的想法是对提供该方法的jobject调用getApplicationContext()。