【问题标题】:Get Struct object in Java from C++从 C++ 获取 Java 中的 Struct 对象
【发布时间】:2011-12-27 00:17:07
【问题描述】:

我有 C++ 结构:

typedef struct FunctionArgs
{
    char* url;
    char* info;
    int   id;
    bool  isWorking;
}

C++函数,它作为参数得到FunctionArgs struct,现在我想从这个函数调用Java方法并作为该方法的参数给FunctionArgs struct。

void func( const FunctionArgs& args )
{
    // Do some code ...

    env->CallObjectMethod( clazzObject, clazzMethod, args );

}

正如您在 env->CallObjectMethod( clazzObject, clazzMethod, *args ); 函数中看到的第三个参数,我给出了 args,即 FunctionArgs 结构对象。

JAVA 我有类和功能:

class JFunctionArgs 
{
    String url;
    String info;
    int   id;
    boolean  isWorking;
}

public class SomeClass
{
    public void func( JFunctionArgs args )
    {

    }
}

我想知道

  1. 我可以做一些我做的事情env->CallObjectMethod( clazzObject, clazzMethod, args );,我的意思是我可以将结构对象作为参数提供给 CallObjectMethod 吗?
  2. 如何在 Java 代码 func 中获取 struct 对象?

【问题讨论】:

    标签: java android java-native-interface


    【解决方案1】:

    你不能。假设您实际上需要在 Java 和 C 中使用这些数据,则需要在 Java Object 和 C struct 之间编组。

    在您的 JNI 代码中,您需要创建一个新的 Java 对象并填充其数据。例如:

    jclass clazz = env->FindClass("JFunctionArgs");
    jmethodID ctor = env->GetMethodID(clazz, "<init>", "()V");
    jobject obj = env->NewObject(clazz, ctor);
    
    jfieldID urlField = env->GetFieldID(clazz, "url", "Ljava/lang/String;");
    env->SetObjectField(obj, urlField, env->NewString(functionArgs.url));
    

    ...等等。

    (但是,如果您只需要在 C 中修改 struct 的数据,您可以简单地返回一个指向它的指针,并将其视为 Java 中的不透明 long。)

    【讨论】:

      【解决方案2】:

      您可以这样做,但您必须自己映射这些值。你应该看看这个问题:How to pass C structs back and forth to Java code in JNI?

      【讨论】:

        猜你喜欢
        • 2014-11-01
        • 2018-05-04
        • 2018-11-15
        • 2023-04-11
        • 2014-09-28
        • 2012-11-26
        • 2022-11-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多