我有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‘(又名'_JNIEnv')不是指针;您是指使用'.’吗?
或者,如果我在安卓工作室翻过鼠标,上面写着:
将'->‘运算符应用于JNIEnv而不是指针
我在这里遗漏了什么,NewStringUTF是jni.h库的一部分,但是为什么它没有“链接”呢?
发布于 2017-11-27 12:53:35
我用以下方法修复它:
#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密钥文章是完全工作的。
当我改变
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");
}发布于 2017-11-28 04:51:18
正如michael在c++中所指出的,您可以像下面这样调用JNIenv函数。
env->NewStringUTF("PuTy0uR4Ppl1C4TioNk3yH3re")不需要包装env并在函数中再次传递,只有在只使用c时才会这样做。
https://stackoverflow.com/questions/47504229
复制相似问题