【问题标题】:How to call a Java method from C++ / JNI which takes an Android Context parameter如何从 C++/JNI 调用采用 Android Context 参数的 Java 方法
【发布时间】:2013-03-11 01:22:31
【问题描述】:

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

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

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    在获取构造函数的方法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 方法的情况下获得上下文?
    • 您应该从 Java 中传入一个,就像在 Java 类中一样。虽然如果你很聪明的话,可以找到应用程序上下文,但这不是一个好的设计(并且会降低你的类的可测试性)。
    猜你喜欢
    • 2012-07-04
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 2011-09-28
    相关资源
    最近更新 更多