如何从C++ / JNI调用一个带有Android Context参数的Java方法

5
我正在尝试通过C++/JNI在Android上调用Java类。具体来说,我正在尝试调用此类的构造函数,该构造函数将Android上下文作为参数。如果我的构造函数没有参数,我可以成功地进行调用,但是当我包含必要的上下文作为参数时,我不知道我的JNI签名应该是什么样子的,并且也怀疑是否可能,因为我无法访问该上下文对象。
因此,我的问题是,是否可能调用一个以Android Context作为唯一参数的Java类的构造函数?如果是这样,如何操作? 如果不行,是否有解决方法,因为我需要上下文来访问某些Android API类。

这个有帮助吗?使用C++与Android ndk/jni - static
2个回答

2
我不相信你所说的方式是可能的。但是,如果不知道类的结构,您可以始终将其创建为单例,并在Activity启动时实例化静态实例,从而使类在那时获得所需的上下文。它基本上会一直存在,直到您准备从C++中调用它,但确实可用于使用上下文服务您的请求。

0
当获取构造函数的方法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);

谢谢您提供语法,但是有没有办法在不首先传递Java方法的情况下获得上下文? - Drake Amara
你应该像在Java类中一样从Java中传递一个。虽然如果你很聪明的话,可能可以找到应用程序上下文,但这不是好的设计(而且会使你的类变得不太可测试)。 - Jeremy Roman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接