2016-07-21 24 views
0

JavaでRPIセンスハットを使用できるようネイティブモジュールで作業しています。ネイティブはコンパイルされません。 現時点では、文字列としてデータを返そうとしていますが、もっと簡単な方法を教えてください。JNI IMUコードで " - >"の基本オペランドが非ポインタ型 'JNIEnv' "

#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); 
    } 

    // This is an opportunity to manually override any settings before the call IMUInit 

    // set up IMU 

    imu->IMUInit(); 

    // this is a convenient place to change fusion parameters 

    imu->setSlerpPower(0.02); 
    imu->setGyroEnable(true); 
    imu->setAccelEnable(true); 
    imu->setCompassEnable(true); 

    // set up pressure sensor 

    if (pressure != NULL) 
     pressure->pressureInit(); 

    // set up 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)); 
} 

いっぱいのエラーがある:ここで は、ソースファイル(SenseHat.cpp)である

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)); 

コード^

コンパイル:

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 

答えて

1

JNIEnvが宣言されていますCおよびC++ではビットが異なります。詳細はjni.hを参照してください。いくつかの言葉ではCで、私たちはCで

(*env)->NewStringUTF(env,imuData.temperature); 

を使用する++あなたがC++バージョンはenv間接参照を必要とし、JNI関数の最初のパラメータとして渡すはありません見ての通り、それは

env->NewStringUTF(imuData.temperature); 

でなければなりません。

関連する問題