捕获JNIENV*内c++ lambda表达式错误

capture JNIENV* inside C++ lambda expression error

本文关键字:lambda 表达式 错误 c++ JNIENV 捕获      更新时间:2023-10-16

我在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");
});