捕获JNIENV*内c++ lambda表达式错误
capture JNIENV* inside C++ lambda expression error
我在Main.cpp文件中有这样一个JNI调用:
JNIEXPORT jstring JNICALL
Java_packagename_MainActivity_GenerateAlphabet(JNIEnv *env, jobject thiz)
{
generateAlphabet([](string letters, string numbers) {
return (env)->NewStringUTF("test");
});
}
但是这段代码给了我错误:
jni/Main.cpp: lambda函数:
jni/Main.cpp:86:33: error: 'env'未被捕获
我真的需要在lambda函数中使用env,有人能帮我吗?
编辑:接受的答案解决了问题,但请记住,您不能在lambda表达式中返回值。
您可以使用[env]
将env
放在捕获列表中。
,这是一个非常坏主意。捕获的env
仅对特定线程有效。如果在不同的线程上调用lambda,则不会定义结果。
您可以捕获lambda中的JavaVM*
指针(可以从传递的env
获得),并使用AttachCurrentThread
在lambda中检索适当的env
。
在c++中,您需要指定哪些变量可以在lambda表达式(即捕获的)中访问。
开始的[]
是一个空捕获列表。只需在其中添加env
以捕获env
(按值):
[env](string letters, string numbers) {
return (env)->NewStringUTF("test");
});
相关文章:
- 这 4 个 lambda 表达式之间有什么区别?
- 使用成员在类中创建 lambda 表达式
- 将 lambda 表达式传递给 std::function in C++
- 在 lambda 表达式中使用 std::atomic
- &&对lambda表达式有什么好处?
- Tbb 库:错误:编写自定义类函数而不是 lambda 表达式时,对函数的调用不匹配
- 列表.erase 中的 lambda 表达式
- 使用 lambda 表达式的 Raspbian G++ 8.3.0 导致 ']' 之前的预期主表达式 - 即使标准设置为 c++14
- 仅通过引用捕获的 lambda 表达式是否保证不会抛出?
- C++: priority_queue:模板参数中的 lambda 表达式
- 容器如何处理 lambda 表达式的参数
- 在C++ Lambda 表达式中,为什么人们更喜欢按值捕获而不是作为参数传递?
- 如何在 lambda 表达式中传递变量?
- 针对 std::function 的 lambda 表达式和模板推导:为什么会这样?
- 如何修改Lambda表达式以将输出放入文本文件
- C++如何使用lambda表达式来捕获上一次迭代的值
- 为什么Qt在信号和插槽中为lambda表达式抛出错误?
- C++:从捕获函数参数的函数返回 lambda 表达式
- C++ Lambda 表达式:通过 ref 开销捕获
- Qt 连接无法识别 lambda 表达式