/* * 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; }