从java本机方法返回对象

时间:2014-03-10 13:01:21

标签: java c++ java-native-interface

我想通过本机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?

2 个答案:

答案 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。