从java本机方法返回对象

从java本机方法返回对象,java,c++,java-native-interface,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接口调用一个方法,该接口返回一个对象

这是我的母语

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?

在JNI中,您有一个方法

JNIEnv->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);
}
JNIEXPORT作业对象JNICALL Java\u org\u smartcar\u serverdatainterface\u shared\u services\u CppConnector\u getProjectionPoint(JNIEnv*env、jobject obj、jdouble lat、jdouble lon)
{
jclass cls=env->GetObjectClass(obj);
jmethodID构造函数=env->GetMethodID(cls,”,“(DD)V”);
返回env->NewObject(cls、构造函数、lat、lon);
}
您应该修改类构造函数以接收两个参数。你也可以按字段初始化,但是它需要在C++中调用GETField2两次。

< P>我整理出问题

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);
}
JNIEXPORT作业对象JNICALL Java\u org\u smartcar\u serverdatainterface\u shared\u services\u CppConnector\u getProjectionPoint
(JNIEnv*env,jobject对象,jdouble lat,jdouble lon)
{
jclass class=(*env)->FindClass(env,“org/smartcar/serverdatainterface/shared/businessentities/Node”);
if(NULL==类)
打印错误(“类”);
jmethodID=(*env)->GetMethodID(env,class,”,“(DD)V”);
如果(NULL==cid)
打印错误(“方法”);
return(*env)->NewObject(env、class、cid、lat、lon);
}

这非常有效

看看:Buff。。。也许抄袭比较好,你不觉得吗?对不起,我误解了你的问题;我相应地编辑了我的答案。我得到了这个错误“error:request for member'GetObjectClass'in something not a structure or union”您是否包括jni.h?
GetObjectClass
在这种情况下有效,因为该方法是与要创建的对象在同一类中的实例方法。我会感到困惑
FindClass
更清晰。