如何从C ++ / JNI调用Java方法,该方法采用Android Context参数

时间:2013-03-11 01:22:31

标签: java android c++ java-native-interface

我试图通过Android上的C ++ / JNI调用Java类。更具体地说,我试图调用此类的构造函数,该构造函数将Android上下文作为参数。如果我的构造函数没有参数,我没有问题成功调用,但是当我将必要的Context作为参数包含在内时,我不知道我的JNI签名应该是什么样的,并且还怀疑这是否可能因为我没有访问该上下文对象。

所以,我的问题是,是否可以调用Java类的构造函数,该类将Android上下文作为其唯一参数?如果是这样,怎么样? 如果没有,是否有解决方法,因为我需要上下文来访问某些Android API类。

2 个答案:

答案 0 :(得分:2)

我不相信你说的方式可能。但是,如果不了解类的结构,您可以始终将其创建为具有静态实例的单例,该实例在启动Activity时实例化,从而该类在此时获得所需的上下文。它基本上会坐在那里,直到你准备从C ++调用,但确实可以用你的请求服务你的请求。

答案 1 :(得分:0)

获取构造函数的方法ID时,只需指定所需的方法ID即可。目前,您可能正在做类似的事情:

constructor = (*env)->GetMethodID(env, cls, "<init>", "()V");
object = (*env)->NewObject(env, cls, constructor);

相反,您希望在使用GetMethodID时指定参数的类型,并在调用NewObject时将其传入。

constructor = (*env)->GetMethodID(env, cls, "<init>", "(Landroid/content/Context;)V");
object = (*env)->NewObject(env, cls, constructor, context);