5

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

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

4

2 回答 2

2

我不相信它可能以你所说的方式。但是,在不知道类的结构的情况下,您始终可以将其创建为带有静态实例的单例,该实例在您的 Activity 启动时被实例化,从而该类在当时获得所需的上下文。它基本上会坐在那里,直到您准备好从 C++ 调用,但确实可以通过上下文为您的请求提供服务。

于 2013-03-12T00:07:21.173 回答
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);
于 2013-03-11T04:29:11.840 回答