我有 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 )
{
}
}
env->CallObjectMethod( clazzObject, clazzMethod, args );
的事情,我的意思是我可以将结构对象作为参数提供给CallObjectMethod吗?答案 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?。