[英]How can I pass a Struct from C back to Java via JNI
我有一个C struct
:
struct MyEntity {
char *_myEntityType;
};
我创建了一个实例:
struct MyEntity my_C_Entity()
{
struct MyEntity myEntity;
myEntity . _myEntityType = strdup("user");
return myEntity;
}
我想在Java中获取struct MyEntity my_C_Entity
:
Java MyEntity
Object类
public class MyEntity {
private String _myEntityType;
public String get_myEntityType() {
return _myEntityType;
}
public void set_myEntityType(String _myEntityType) {
_myEntityType = _myEntityType;
}
}
然后...
public class FromCPP {
// Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("native-lib");
}
public native MyEntity _main();
}
如何在my_C_Entity
的Struct struct MyEntity
中设置MyEntity
的对象成员?
extern "C"
JNIEXPORT jobject JNICALL
Java_myproject_1_FromCPP__1main(JNIEnv *env, jobject instance) {
// set the values here
}
可以这样做:
jclass ent_clazz = env->FindClass("com/your/package/MyEntity");
if (!ent_clazz) return NULL;
// Get the IDs of the constructor and the _myEntityType field
jmethodID ent_init = env->GetMethodID(ent_clazz, "<init>", "()V");
jfieldID fid = env->GetFieldID(ent_clazz, "_myEntityType", "Ljava/lang/String;");
if (!ent_init || !fid) return NULL;
// Create a Java MyEntity instance
jobject result = env->NewObject(ent_clazz, ent_init);
if (!result || env->ExceptionCheck() != JNI_FALSE) {
env->ExceptionClear();
return NULL;
}
// entity is your C MyEntity instance
jstring jstr = env->NewStringUTF(entity._myEntityType);
if (!jstr || env->ExceptionCheck() != JNI_FALSE) {
env->ExceptionClear();
return NULL;
}
// Set the String field
env->SetObjectField(result, fid, jstr);
return result;
如果您在Java MyEntity
类中添加了一个_myEntityType
初始值的_myEntityType
,则可以创建对象并一步初始化该字段,从而无需GetFieldID
和SetObjectField
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.