Java 从C++;

Java 从C++;,java,android,java-native-interface,Java,Android,Java Native Interface,我有C++struct: typedef struct FunctionArgs { char* url; char* info; int id; bool isWorking; } 和C++函数,作为参数得到functorgsstruct,现在我想从这个函数调用Java方法,作为该方法的参数得到functorgsstruct void func( const FunctionArgs& args ) { // Do some code .

我有C++struct:

typedef struct FunctionArgs
{
    char* url;
    char* info;
    int   id;
    bool  isWorking;
}
C++函数,作为参数得到
functorgs
struct,现在我想从这个函数调用Java方法,作为该方法的参数得到
functorgs
struct

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

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

}
正如您在
env->CallObjectMethod(clazzObject,clazzMethod,*args)中看到的那样函数作为我给出的第三个参数
args
,它是
functorgs
struct对象

JAVA中,我有类和函数:

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

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

    }
}
我想知道
  • 我可以做一些我做的事情吗
    env->CallObjectMethod(clazzObject,clazzMethod,args),我的意思是我可以将struct object作为参数提供给CallObjectMethod吗
  • 如何在Java代码func中获取struct对象

  • 您可以这样做,但您必须自己映射这些值。你应该看看这个问题:。

    你不能。假设您实际上需要在Java和C中使用这些数据,您将需要在Java
    对象
    和C
    结构
    之间进行封送处理

    在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));
    
    jclass clazz=env->FindClass(“jfunctorgs”);
    jmethodID=env->GetMethodID(clazz,“,”()V”);
    jobject obj=env->NewObject(clazz,ctor);
    jfieldID urlField=env->GetFieldID(clazz,“url”,“Ljava/lang/String;”);
    env->SetObjectField(obj,urlField,env->NewString(functorgs.url));
    
    ……等等

    (但是,如果只需要在C中修改
    结构的数据,只需返回指向它的指针,并在Java中将其视为不透明的
    long