Beispiel #1
0
/*
 * Class:     ml_dmlc_xgboost4j_java_XGBoostJNI
 * Method:    XGBoosterEvalOneIter
 * Signature: (JI[J[Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jint JNICALL Java_ml_dmlc_xgboost4j_java_XGBoostJNI_XGBoosterEvalOneIter
  (JNIEnv *jenv, jclass jcls, jlong jhandle, jint jiter, jlongArray jdmats, jobjectArray jevnames, jobjectArray jout) {
  BoosterHandle handle = (BoosterHandle) jhandle;
  std::vector<DMatrixHandle> dmats;
  std::vector<std::string> evnames;
  std::vector<const char*> evchars;

  size_t len =  static_cast<size_t>(jenv->GetArrayLength(jdmats));
  // put handle from jhandles to chandles
  jlong* cjdmats = jenv->GetLongArrayElements(jdmats, 0);
  for (size_t i = 0; i < len; ++i) {
    dmats.push_back((DMatrixHandle) cjdmats[i]);
    jstring jevname = (jstring)jenv->GetObjectArrayElement(jevnames, i);
    const char *s =jenv->GetStringUTFChars(jevname, 0);
    evnames.push_back(std::string(s, jenv->GetStringLength(jevname)));
    if (s != nullptr) jenv->ReleaseStringUTFChars(jevname, s);
  }
  jenv->ReleaseLongArrayElements(jdmats, cjdmats, 0);
  for (size_t i = 0; i < len; ++i) {
    evchars.push_back(evnames[i].c_str());
  }
  const char* result;
  int ret = XGBoosterEvalOneIter(handle, jiter,
                                 dmlc::BeginPtr(dmats),
                                 dmlc::BeginPtr(evchars),
                                 len, &result);
  jstring jinfo = nullptr;
  if (result != nullptr) {
    jinfo = jenv->NewStringUTF(result);
  }
  jenv->SetObjectArrayElement(jout, 0, jinfo);
  return ret;
}
/*
 * Class:     org_dmlc_xgboost4j_wrapper_XgboostJNI
 * Method:    XGBoosterEvalOneIter
 * Signature: (JI[J[Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jint JNICALL Java_org_dmlc_xgboost4j_wrapper_XgboostJNI_XGBoosterEvalOneIter
  (JNIEnv *jenv, jclass jcls, jlong jhandle, jint jiter, jlongArray jdmats, jobjectArray jevnames, jobjectArray jout) {
    BoosterHandle handle = (BoosterHandle) jhandle;
    DMatrixHandle* dmats = 0;
    char **evnames = 0;
    char *result = 0;
    bst_ulong len = (bst_ulong)jenv->GetArrayLength(jdmats);     
    if(len > 0) {
        dmats = new DMatrixHandle[len];
        evnames = new char*[len];
    }
    //put handle from jhandles to chandles
    jlong* cjdmats = jenv->GetLongArrayElements(jdmats, 0);
    for(bst_ulong i=0; i<len; i++) {
        dmats[i] = (DMatrixHandle) cjdmats[i];
    }
    //transfer jObjectArray to char**, user strcpy and release JNI char* inplace
    for(bst_ulong i=0; i<len; i++) {
        jstring jevname = (jstring)jenv->GetObjectArrayElement(jevnames, i);
        const char* cevname = jenv->GetStringUTFChars(jevname, 0);
        evnames[i] = new char[jenv->GetStringLength(jevname)];
        strcpy(evnames[i], cevname);
        jenv->ReleaseStringUTFChars(jevname, cevname);
    }
    
    int ret = XGBoosterEvalOneIter(handle, jiter, dmats, (char const *(*)) evnames, len, (const char **) &result);    
    if(len > 0) {
        delete[] dmats;
        //release string chars
        for(bst_ulong i=0; i<len; i++) {
            delete[] evnames[i];
        }        
        delete[] evnames;
        jenv->ReleaseLongArrayElements(jdmats, cjdmats, 0);
    }
    
    jstring jinfo = 0;
    if (result) jinfo = jenv->NewStringUTF((const char *) result);
    jenv->SetObjectArrayElement(jout, 0, jinfo);
  
    return ret;
}