|
Ok, I was a little wrong with my last statement. When you set the data it stores it to a local variable array and doesnt set them until you set the models iteration count. Si it goes like this:
SetIterationCount("4")
setValues()
matlabEng.engEvalString ((Engine *)id,variable + " = [" + value + "]")
matlabEng.engEvalString (id,"set_param('"+theModel+"', 'SimulationCommand','Start')");
Thats pretty much what made it ran. JMatLink uses a DLL, is open source, to do everything, but it did have some 'C' files in it. I found 3 functions that I thought might be in work here.
The First: Set the variable
JNIEXPORT jint JNICALL Java_jmatlink_CoreJMatLink_engEvalStringNATIVE
(JNIEnv *env, jobject obj, jlong enginePtr, jstring evalS_JNI)
{
int retValI = 0;
const char *evalS = (*env)->GetStringUTFChars(env, evalS_JNI, 0);
// evaluate expression in MATLAB
retValI = engEvalString((Engine *)enginePtr, evalS);
if (retValI != 0)
printf("engEvalStringNATIVE: return value !=0, some error\n");
//printf("evalString %i",OpenB);
(*env)->ReleaseStringUTFChars(env, evalS_JNI, evalS); // free memory
return retValI;
}
The second: Convert data to matlab?
JNIEXPORT void JNICALL Java_jmatlink_CoreJMatLink_engPutVariableNATIVE
(JNIEnv *env, jobject obj, jlong enginePtr, jstring arrayS_JNI, jobjectArray valueDD_JNI)
{
int i;
int j;
mxArray *T = NULL;
const char *arrayS;
int rowCount;
jobject colPtr;
int colCount;
double *tPtrR;
jdouble *arrayElements;
arrayS = (*env)->GetStringUTFChars(env, arrayS_JNI, 0);
rowCount = (*env)->GetArrayLength(env, valueDD_JNI);
colPtr = (*env)->GetObjectArrayElement(env, valueDD_JNI, 0);
colCount = (*env)->GetArrayLength(env, colPtr);
if (debugB) printf("engPutArray [][] %s %i %i\n", arrayS, rowCount, colCount);
// create MATLAB array
T = mxCreateDoubleMatrix(rowCount, colCount, mxREAL);
// get pointer on array
tPtrR = mxGetPr(T);
// copy array elements from java to MATLAB
for (i=0; i<rowCount; i++) {
//printf("row %i\n",i);
colPtr = (*env)->GetObjectArrayElement(env, valueDD_JNI, i);
//printf("got colPtr %i\n",i);
arrayElements = (*env)->GetDoubleArrayElements(env, colPtr, 0);
for (j=0; j<colCount; j++) {
//printf("col %i\n",j);
tPtrR[i + j*rowCount] = arrayElements[j];
}
//?? (suggestion of Dan Cervelli 13.09.2002) because of memory leak?
(*env)->ReleaseDoubleArrayElements(env, colPtr, arrayElements, 0);
} // rows
// send array to MATLAB
engPutVariable((Engine *)enginePtr, arrayS, T );
// free memory for array
mxDestroyArray(T);
// free memory for String
(*env)->ReleaseStringUTFChars(env, arrayS_JNI, arrayS);
}
The Third: Get data back
JNIEXPORT jdouble JNICALL Java_jmatlink_CoreJMatLink_engGetScalarNATIVE
(JNIEnv *env, jobject obj, jlong enginePtr, jstring scalarS_JNI)
{
mxArray *arrayP;
jdouble scalar;
// get name of scalar
const char *scalarS = (*env)->GetStringUTFChars(env, scalarS_JNI, 0);
if (debugB) printf("native engGetScalar %s \n",scalarS);
// get variable from MATLAB
arrayP = engGetVariable( (Engine *)enginePtr, scalarS);
if (arrayP == NULL) {
printf("Could not get scalar from MATLAB workspace.\n");
(*env)->ReleaseStringUTFChars(env, scalarS_JNI, scalarS); // free memory
return 0;
}
// get scalar value from array
scalar = mxGetScalar(arrayP);
// free memory
mxDestroyArray(arrayP);
(*env)->ReleaseStringUTFChars(env, scalarS_JNI, scalarS);
return scalar;
}
I don't know what else is going on behind the scenes, but these were in the main 'C' file that came with the dll I recieved.
|