Java Android NDK,如何将上下文传递到本机代码?使用哪种类型?

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

我是JNI的新手。在我的android项目中,我有一个java类,它声明了一个本机函数:

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本机代码中,我知道对于java
String
,我应该使用type
jString
,但是如何将上下文传递给本机代码呢


我需要在我的本机代码中键入
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()。