java - JNI IMU code not compiling "base operand of ‘->’ has non-pointer type ‘JNIEnv’" -


i'm working on native module allow use of rpi sense hat in java , native not compile: @ moment i'm trying return data strings, if have simpler way please show me. here source file (sensehat.cpp):

#include <jni.h> #include <stdio.h> #include "sensehat.h" #include "rtimulib.h"   rtimu *imu; rtpressure *pressure; rthumidity *humidity;  jniexport void jnicall java_sensehat_init(jnienv *env, jobject thisobj) {      rtimusettings *settings = new rtimusettings("rtimulib");      imu = rtimu::createimu(settings);     pressure = rtpressure::createpressure(settings);     humidity = rthumidity::createhumidity(settings);      if ((imu == null) || (imu->imutype() == rtimu_type_null)) {         printf("no imu found\n");         exit(1);     }      //  opportunity manually override settings before call imuinit      //  set imu      imu->imuinit();      //  convenient place change fusion parameters      imu->setslerppower(0.02);     imu->setgyroenable(true);     imu->setaccelenable(true);     imu->setcompassenable(true);      //  set pressure sensor      if (pressure != null)         pressure->pressureinit();      //  set humidity sensor      if (humidity != null)         humidity->humidityinit();  }  jniexport jstring jnicall java_sensehat_gettemperature(jnienv *env, jobject thisobj) {    rtimu_data imudata = imu->getimudata();    if (humidity != null)       humidity->humidityread(imudata);    return ((*env)->newstringutf(env,imudata.temperature)); }  jniexport jstring jnicall java_sensehat_gethumidity(jnienv *env, jobject thisobj) {    rtimu_data imudata = imu->getimudata();    if (humidity != null)       humidity->humidityread(imudata);    return ((*env)->newstringutf(env,imudata.humidity));  }  jniexport jstring jnicall java_sensehat_getorientation(jnienv *env, jobject thisobj) {    rtimu_data imudata = imu->getimudata();    return ((*env)->newstringutf(env,imudata.fusionpose)); } 

the full errors is:

sensehat.cpp: in function ‘_jstring* java_sensehat_gettemperature(jnienv*, jobject)’: sensehat.cpp:53:18: error: base operand of ‘->’ has non-pointer type ‘jnienv’     return ((*env)->newstringutf(env,imudata.temperature));                   ^ sensehat.cpp: in function ‘_jstring* java_sensehat_gethumidity(jnienv*, jobject)’: sensehat.cpp:60:18: error: base operand of ‘->’ has non-pointer type ‘jnienv’     return ((*env)->newstringutf(env,imudata.humidity));                   ^ sensehat.cpp: in function ‘_jstring* java_sensehat_getorientation(jnienv*, jobject)’: sensehat.cpp:66:18: error: base operand of ‘->’ has non-pointer type ‘jnienv’     return ((*env)->newstringutf(env,imudata.fusionpose)); 

^

compile code:

gcc -i /usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt/include/ -i /usr/lib/jvm/jdk-8-oracle-arm32-vfp-hflt/include/linux/ -shared -o libsensehat.so sensehat.cpp 

jnienv declared bit different c , c++, see jni.h details. in few words in c use

(*env)->newstringutf(env,imudata.temperature); 

in c++ should be

env->newstringutf(imudata.temperature); 

as see c++ version doesn't need env dereference , passing first parameter jni functions.


Comments