首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不编译“‘->’基操作数‘有非指针类型’JNIEnv‘的JNI IMU代码

不编译“‘->’基操作数‘有非指针类型’JNIEnv‘的JNI IMU代码
EN

Stack Overflow用户
提问于 2016-07-21 15:02:51
回答 1查看 251关注 0票数 0

我正在开发一个本机模块,以允许在java中使用RPI感知帽子,而我的本机不会编译:目前,我只是尝试以字符串的形式返回数据,如果您有更简单的方法,请告诉我。下面是源文件(SenseHat.cpp):

代码语言:javascript
复制
#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));
}

全部错误是:

代码语言:javascript
复制
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));

^

编译代码:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-21 15:40:04

对于C和C++,JNIEnv声明有一点不同,详细信息请参见jni.h。在C语言中,我们用几个词

代码语言:javascript
复制
(*env)->NewStringUTF(env,imuData.temperature);

在C++中,应该是

代码语言:javascript
复制
env->NewStringUTF(imuData.temperature);

如您所见,C++版本不需要env取消引用,并将其作为第一个参数传递给JNI函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38507779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档