我想通过本机java接口调用一个方法,该接口返回一个对象。
这是我的原生方法
public native Node getProjectionPoint(double lat, double lon);
节点类
public class Node {
private String id;
private double latitude;
private double longitude;
}
C头文件
JNIEXPORT jobject JNICALL Java_org_smartcar_serverdatainterface_shared_services_CppConnector_getProjectionPoint (JNIEnv *env, jobject obj, jdouble lat, jdouble lon);
我怎样才能创建一个对象并将其返回给java?
答案 0 :(得分:3)
我解决了问题
JNIEXPORT jobject JNICALL Java_org_smartcar_serverdatainterface_shared_services_CppConnector_getProjectionPoint
(JNIEnv *env, jobject obj, jdouble lat, jdouble lon)
{
jclass class = (*env)->FindClass(env,"org/smartcar/serverdatainterface/shared/businessentities/Node");
if (NULL == class)
PrintError ("class");
jmethodID cid = (*env)->GetMethodID(env,class, "<init>", "(DD)V");
if (NULL == cid)
PrintError ("method");
return (*env)->NewObject(env, class, cid, lat, lon);
}
这完美无缺
答案 1 :(得分:1)
在JNI中你有一个方法
JNIEnv-&gt; NewObject(),它调用给定Java类的实际构造函数。
可能是这样的:
JNIEXPORT jobject JNICALL Java_org_smartcar_serverdatainterface_shared_services_CppConnector_getProjectionPoint (JNIEnv *env, jobject obj, jdouble lat, jdouble lon)
{
jclass cls = env->GetObjectClass(obj);
jmethodID constructor = env->GetMethodID(cls, "<init>", "(DD)V");
return env->NewObject(cls, constructor, lat, lon);
}
您应该修改类构造函数以接收两个参数。您也可以逐字段初始化,但需要在C ++中调用两次GetFieldID。