首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android :成员引用类型'JNIEnv‘(又名'_JNIEnv')不是指针

Android :成员引用类型'JNIEnv‘(又名'_JNIEnv')不是指针
EN

Stack Overflow用户
提问于 2017-11-27 05:03:59
回答 2查看 2.9K关注 0票数 2

我有gradle应用程序模块:

代码语言:javascript
复制
externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }

使用CMakeLists.txt:

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

代码语言:javascript
复制
#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‘(又名'_JNIEnv')不是指针;您是指使用'.’吗?

或者,如果我在安卓工作室翻过鼠标,上面写着:

将'->‘运算符应用于JNIEnv而不是指针

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-27 12:53:35

我用以下方法修复它:

代码语言:javascript
复制
#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在这里引用如下:使用Android保护API密钥文章是完全工作的。

当我改变

代码语言:javascript
复制
ndkBuild {
            path 'src/main/jni/Android.mk'
        }

代码语言:javascript
复制
externalNativeBuild {
    cmake {
        path "CMakeLists.txt"
    }
}

下面的代码不起作用:

代码语言:javascript
复制
#include <jni.h>

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

Stack Overflow用户

发布于 2017-11-28 04:51:18

正如michael在c++中所指出的,您可以像下面这样调用JNIenv函数。

代码语言:javascript
复制
env->NewStringUTF("PuTy0uR4Ppl1C4TioNk3yH3re")

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

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

https://stackoverflow.com/questions/47504229

复制
相关文章

相似问题

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