JNI IMU 代码未编译“‘->’的基本操作数具有非指针类型‘JNIEnv’”

Posted

技术标签:

【中文标题】JNI IMU 代码未编译“‘->’的基本操作数具有非指针类型‘JNIEnv’”【英文标题】:JNI IMU code not compiling "base operand of ‘->’ has non-pointer type ‘JNIEnv’" 【发布时间】:2016-07-21 15:02:51 【问题描述】:

我正在开发一个本机模块,以允许在 java 中使用 RPI 感知帽,而我的本机将无法编译: 目前我只是试图将数据作为字符串返回,如果您有更简单的方法,请告诉我。 这是源文件(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);
    

    //  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: 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 语言

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

在 C++ 中应该是

env->NewStringUTF(imuData.temperature);

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

【讨论】:

以上是关于JNI IMU 代码未编译“‘->’的基本操作数具有非指针类型‘JNIEnv’”的主要内容,如果未能解决你的问题,请参考以下文章

对 `JNI_CreateJavaVM' linux 的未定义引用

ubuntu16.04编译安装imu_tk

架构 x86_64 的未定义符号:JNI_CreateJavaVM OS-X Xcode

jni报错日志打印方法未定义

jni 未定义符号错误

JNI