procedure TfrmJNITestMain.btnCompassClick(Sender: TObject);var sensorManagerClass, sensorClass : jclass; sensorManagerObject, sensorObject : jobject; javaMethodId_getRotationMatrix, javaMethodId_getOrientation : JMethodID; javaString_SENSOR_SERVICE, javaString_getRotationMatrix, javaString_getOrientation : jstring; lParams : array[0..4] of JValue; IsCopy : JBoolean; mGData,MData, mOrientation : JDoubleArray; mR, mI : JDoubleArray; arraydata : PDouble; arraylen : jsize; i : integer;begin // get sensorManagerClass sensorManagerClass := javaEnvRef^^.FindClass(javaEnvRef, 'android/hardware/SensorManager'); if sensorManagerClass = nil then debugln('******** sensorManagerClass NIL ********') else debugln('******** sensorManagerClass NOT NIL ********'); // get the string Context.SENSOR_SERVICE remember that NewStringUTF does not require ReleaseStringUTFChars javaString_SENSOR_SERVICE := javaEnvRef^^.NewStringUTF(javaEnvRef, pchar('sensor')); // Get the sensorManagerObject lParams[0].l := javaString_SENSOR_SERVICE; sensorManagerObject := javaEnvRef^^.CallObjectMethodA(javaEnvRef, javaActivityObject, javaMethod_getSystemService, @lParams[0]); if sensorManagerObject = nil then debugln('******** sensorManagerObject NIL ********') else debugln('******** sensorManagerObject NOT NIL ********'); // get MethidId for getRotationMatrix javaMethodId_getRotationMatrix := javaEnvRef^^.GetStaticMethodID(javaEnvRef, sensorManagerClass, 'getRotationMatrix', '([F[F[F[F)Z'); if javaMethodId_getRotationMatrix = nil then debugln('******** javaMethodId_getRotationMatrix NIL ********') else debugln('******** javaMethodId_getRotationMatrix NOT NIL ********'); mR := javaEnvRef^^.NewDoubleArray(javaEnvRef, 16); mI := javaEnvRef^^.NewDoubleArray(javaEnvRef, 16); mGData := javaEnvRef^^.NewDoubleArray(javaEnvRef, 3); MData := javaEnvRef^^.NewDoubleArray(javaEnvRef, 3); lParams[0].l := mR; lParams[1].l := mI; lParams[2].l := mGData; lParams[3].l := MData; debugln('******** After loading lParams for getRotationMatrix ********'); javaEnvRef^^.CallVoidMethodA(javaEnvRef, javaActivityObject, javaMethodId_getRotationMatrix, @lParams[0]); debugln('******** After getRotationMatrix ********'); // Get the elements and length IsCopy := 0; arraydata := javaEnvRef^^.GetDoubleArrayElements(javaEnvRef, mR, IsCopy); arraylen := javaEnvRef^^.GetArrayLength(javaEnvRef, mR); debugln('******** arraylen-mR: ' + IntToStr(arraylen) + ' ********'); i := 0; while i < arraylen do begin debugln('******** mR[' + IntToStr(i) + ']: ' + FloatToStrF(arraydata[i], ffFixed, 15, 3) + ' ********'); Inc(i); end; // Get the elements and length IsCopy := 0; arraydata := javaEnvRef^^.GetDoubleArrayElements(javaEnvRef, mI, IsCopy); arraylen := javaEnvRef^^.GetArrayLength(javaEnvRef, mI); debugln('******** arraylen-mI: ' + IntToStr(arraylen) + ' ********'); i := 0; while i < arraylen do begin debugln('******** mI[' + IntToStr(i) + ']: ' + FloatToStrF(arraydata[i], ffFixed, 15, 3) + ' ********'); Inc(i); end; // Release ArrayElements javaEnvRef^^.ReleaseDoubleArrayElements(javaEnvRef, mI, arraydata, 0); // Get the elements and length IsCopy := 0; arraydata := javaEnvRef^^.GetDoubleArrayElements(javaEnvRef, mGData, IsCopy); arraylen := javaEnvRef^^.GetArrayLength(javaEnvRef, mGData); debugln('******** arraylen-mGData: ' + IntToStr(arraylen) + ' ********'); i := 0; while i < arraylen do begin debugln('******** mGData[' + IntToStr(i) + ']: ' + FloatToStrF(arraydata[i], ffFixed, 15, 3) + ' ********'); Inc(i); end; // Release ArrayElements javaEnvRef^^.ReleaseDoubleArrayElements(javaEnvRef, mGData, arraydata, 0); // Get the elements and length IsCopy := 0; arraydata := javaEnvRef^^.GetDoubleArrayElements(javaEnvRef, MData, IsCopy); arraylen := javaEnvRef^^.GetArrayLength(javaEnvRef, MData); debugln('******** arraylen-MData: ' + IntToStr(arraylen) + ' ********'); i := 0; while i < arraylen do begin debugln('******** MData[' + IntToStr(i) + ']: ' + FloatToStrF(arraydata[i], ffFixed, 15, 3) + ' ********'); Inc(i); end; // Release ArrayElements javaEnvRef^^.ReleaseDoubleArrayElements(javaEnvRef, MData, arraydata, 0); // get MethidId for getOrientation javaMethodId_getOrientation := javaEnvRef^^.GetStaticMethodID(javaEnvRef, sensorManagerClass, 'getOrientation', '([F[F)[F'); if javaMethodId_getOrientation = nil then debugln('******** javaMethodId_getOrientation NIL ********') else debugln('******** javaMethodId_getOrientation NOT NIL ********'); mOrientation := javaEnvRef^^.NewDoubleArray(javaEnvRef, 3); lParams[1].l := mOrientation; debugln('******** After loading lParams for getOrientation ********'); javaEnvRef^^.CallVoidMethodA(javaEnvRef, javaActivityObject, javaMethodId_getOrientation, @lParams[0]); debugln('******** After getOrientation ********'); // Get the elements and length IsCopy := 0; arraydata := javaEnvRef^^.GetDoubleArrayElements(javaEnvRef, mOrientation, IsCopy); arraylen := javaEnvRef^^.GetArrayLength(javaEnvRef, mOrientation); debugln('******** arraylen-mOrientation: ' + IntToStr(arraylen) + ' ********'); i := 0; while i < arraylen do begin debugln('******** mOrientation[' + IntToStr(i) + ']: ' + FloatToStrF(arraydata[i], ffFixed, 15, 3) + ' ********'); Inc(i); end; // Release ArrayElements javaEnvRef^^.ReleaseDoubleArrayElements(javaEnvRef, mOrientation, arraydata, 0); javaEnvRef^^.ReleaseDoubleArrayElements(javaEnvRef, mR, arraydata, 0); javaEnvRef^^.DeleteLocalRef(javaEnvRef, lParams[0].l); javaEnvRef^^.DeleteLocalRef(javaEnvRef, lParams[1].l); javaEnvRef^^.DeleteLocalRef(javaEnvRef, lParams[2].l); javaEnvRef^^.DeleteLocalRef(javaEnvRef, lParams[3].l);end;
[code]