Android JNI CMAKE:成员引用类型 'JNIEnv'(又名“_JNIEnv”)不是指针
Android JNI CMAKE: member reference type 'JNIEnv' (aka '_JNIEnv') is not a pointer
我有 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 中不断遇到以下问题:
Error:(5, 18) error: member reference type 'JNIEnv' (aka '_JNIEnv') is
not a pointer; did you mean to use '.'?
或者如果我在 Android 工作室中滚动我的鼠标,它说:
Applying '->' operator to JNIEnv instead of a pointer
我在这里遗漏了什么,NewStringUTF
是 jni.h 库的一部分,但为什么它没有 'link-up'?
我修复它:
#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");
}
正如 michael 在 c++ 中所述,您可以像下面这样调用 JNIenv 函数。
env->NewStringUTF("PuTy0uR4Ppl1C4TioNk3yH3re")
不需要包装 env 并在函数中再次传递,这仅在您仅使用 c 时才这样做。
我有 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 中不断遇到以下问题:
Error:(5, 18) error: member reference type 'JNIEnv' (aka '_JNIEnv') is not a pointer; did you mean to use '.'?
或者如果我在 Android 工作室中滚动我的鼠标,它说:
Applying '->' operator to JNIEnv instead of a pointer
我在这里遗漏了什么,NewStringUTF
是 jni.h 库的一部分,但为什么它没有 'link-up'?
我修复它:
#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");
}
正如 michael 在 c++ 中所述,您可以像下面这样调用 JNIenv 函数。
env->NewStringUTF("PuTy0uR4Ppl1C4TioNk3yH3re")
不需要包装 env 并在函数中再次传递,这仅在您仅使用 c 时才这样做。