【问题标题】:Android JNI CMAKE: member reference type 'JNIEnv' (aka '_JNIEnv') is not a pointerAndroid JNI CMAKE:成员引用类型“JNIEnv”(又名“_JNI​​Env”)不是指针
【发布时间】:2017-11-27 05:03:59
【问题描述】:

我有 gradle 应用模块:

externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }

使用 CMakeLists.txt:

cmake_minimum_required(VERSION 3.4.1)
add_library( # Sets the name of the library.
             native-lib
             SHARED
             src/main/cpp/native-lib.cpp )
add_library( # Sets the name of the library.
             keys
             SHARED
             src/main/cpp/keys.cpp )
find_library( # Sets the name of the path variable.
              log-lib
              log )
target_link_libraries( # Specifies the target library.
                       native-lib
                       ${log-lib} )

和keys.cpp:

#include <jni.h>

JNIEXPORT jstring JNICALL
Java_com_my_app_App_getApplicationKey(JNIEnv *env, jobject instance) {
    return (*env)->  NewStringUTF(env, "PuTy0uR4Ppl1C4TioNk3yH3re");
}

我在我的 cpp 中不断遇到以下问题:

错误:(5, 18) 错误:成员引用类型“JNIEnv”(又名“_JNI​​Env”)为 不是指针;你的意思是用'.'吗?

或者如果我在 Android Studio 中滚动鼠标,它会说:

对 JNIEnv 应用 '->' 运算符而不是指针

我在这里缺少什么,NewStringUTF 是 jni.h 库的一部分,但为什么它没有“链接”?

【问题讨论】:

  • 在 C++ 中你应该使用env-&gt;,而不是(*env)-&gt;
  • yodabest 兄弟,谢谢!

标签: android cmake android-ndk ndk-build


【解决方案1】:

我修复它:

#include <jni.h>
#include <string>

extern "C"
JNIEXPORT jstring

JNICALL
Java_com_my_app_App_getApplicationKey(JNIEnv *env, jobject instance) {
    std::string appKey = "PuTy0uR4Ppl1C4TioNk3yH3re";
    return env->NewStringUTF(appKey.c_str());
}

解决了我的问题,


对我来说唯一仍然神秘的是:

我的 keys.cpp 以上来自这里的参考:Securing API Keys using Android NDK 文章完全有效。

当我改变了

ndkBuild {
            path 'src/main/jni/Android.mk'
        }

externalNativeBuild {
    cmake {
        path "CMakeLists.txt"
    }
}

以下代码无效:

#include <jni.h>

JNIEXPORT jstring JNICALL
Java_com_my_app_App_getApplicationKey(JNIEnv *env, jobject instance) {
    return (*env)->  NewStringUTF(env, "PuTy0uR4Ppl1C4TioNk3yH3re");
}

【讨论】:

  • 您的 Android.mk 为 cpp 扩展设置了 C 编译器,您也可以使用 cmake 对其进行调整。但是保持默认行为并为 JNI 使用 C++ 表示法会更健康
【解决方案2】:

正如 michael 在 c++ 中所说,您调用 JNIenv 函数,如下所示。

env->NewStringUTF("PuTy0uR4Ppl1C4TioNk3yH3re")

无需包装 env 并在函数中再次传递,只有在仅使用 c 时才这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 2012-10-05
    • 2012-07-06
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多