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
Post a Comment