Java 从C++;
我有C++struct: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 .
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
)