从C ++获取Java中的Struct对象

时间:2011-11-11 12:51:36

标签: java android java-native-interface

我有 C ++ 结构:

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

C ++ 函数,作为参数获取FunctionArgs结构,现在我想从这个函数调用Java方法,并作为该方法的参数给出FunctionArgs结构。

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

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

}

正如您在env->CallObjectMethod( clazzObject, clazzMethod, *args );函数中看到的第三个参数一样,我给args FunctionArgs struct object。

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代码中获取struct对象?

2 个答案:

答案 0 :(得分: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。)

答案 1 :(得分:0)

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