草庐IT

JNI_ASSERT

全部标签

java - 如何以定义明确的线程安全方式将 C++ 字符串传递给 Java JNI?

有一个C++函数,通过JNI从Java代码调用。我想将底层的c字符串正确地传递给Java,所以我做了以下安排://main.cppstringglobal;constchar*data()//CalledexternallybyJNI{return(global=func_returning_string()).data();//`.data()`=`.c_str()`}但在这种情况下,函数data()不再是线程安全的。在传递字符串而不导致任何未定义行为的情况下实现线程安全的最佳方法是什么? 最佳答案 Iwanttopasstheu

智慧自助餐饮系统(SpringBoot+MP+Vue+微信小程序+JNI+ncnn+YOLOX-Nano)

一、项目简介本项目是配合智慧自助餐厅下的一套综合系统,该系统分为安卓端、微信小程序用户端以及后台管理系统。安卓端利用图像识别技术进行识别多种不同菜品,识别成功后安卓端显示该订单菜品以及价格并且生成进入小程序的二维码,用户扫描后在小程序进行付款和提交订单,用户也可查看订单和菜品等信息,管理员在Web后台管理系统进行信息查看餐厅运营情况和管理菜品、订单评价等信息。本系统涉及的论文文献,可以进行参考和引用。《基于图像识别的智慧餐饮管理系统》《YOLOX-NanoIntelligentandefficientdishrecognitionsystem》二、涉及技术1、后端:SpringBoot、Spr

c++ - 关于 ints 和 static_assert 的特化

我想编写一个仅适用于2个数字(例如3和5)的模板函数,如果您尝试将其与其他数字一起使用,则会出现错误。我可以这样做:templatevoidf();templatevoidf(){cout()\n";}templatevoidf(){cout()\n";}然后我可以用正常的方式调用这个函数:f();f();它编译得很好,如果我尝试错误地使用我的函数:f();编译器给我一个错误。这种方法有两个问题:1.-这是标准吗?我可以使用整数专门化模板吗?2.-我不喜欢使用这种方法时出现的错误,因为错误不会告诉用户他做错了什么。我更喜欢写这样的东西:templatevoidf(){static_as

c++ - 构造函数的初始化列表之前的 static_assert

有一个非模板化的类,它有一个模板化的构造函数。是否可以在此类构造函数中初始化成员变量之前检查静态断言?​​例如,下面的代码在检查T是否有这样的方法之前执行T::value()。classMyClass{public:templateMyClass(constT&t):m_value(t.value()){static_assert(HasValueMethod::value,"Tmusthaveavalue()method");}private:intm_value;};将static_assert放在构造函数的主体中工作正常,除了它在最后打印“Tmusthaveavalue()met

c++ - 使用 JNI (C++) 从 native 线程调用 Java 方法时出现问题

我有一个JNI问题,希望有人能帮我解决。我正在尝试从native线程调用名为LUSOutputJNI的Java类的构造函数。它在这个特定类的FindClass(...)上一直失败。代码如下:LOGE("1");JNIEnv*env=NULL;LOGE("2");intres=-1;res=g_vm->AttachCurrentThread(&env,NULL);if(env==NULL){LOGE("envisNULL,AttachCurrentThreadfailed");;}if(res>=0)LOGE("AttachCurrentThreadwassuccessful");jcl

java - 从 JNI 代码检查 Java 类中是否存在可选字段或方法

我有一个Java类,可以对其进行子类化以添加额外的字段。有一个相应的C++JNI方法将与该字段交互。但是,我希望JNI代码同时处理基类和子类,这意味着它必须检测该字段是否存在。我的(简化的)JNI代码如下所示:fid=j.GetFieldID(jc,UTF8_SECPARM,SIG_SECPARM);if(fid==0)return;...continuewithfid...虽然GetFieldID()方法返回NULL,但应用程序在处理的某个进一步点出现异常,这似乎与此代码无关。然而,它在某种程度上是相关的,因为如果我只是在GetFieldID()方法之前返回,则没有异常(except

c++ - 应该用 typedef 触发 static_assert 吗?

我注意到当实例化为typedef时,类模板中的静态断言不会被触发。#includetemplatestructtest_assert{static_assert(std::is_same::value,"shouldfail");};typedeftest_assertt;这段代码编译没有错误。如果我尝试创建一个实例,则断言失败:tobj;//error:staticassertionfailed:"shouldfail"最后,如果我将条件替换为false,即使我不实例化类模板,断言也会失败:templatestructtest_assert{static_assert(false,"

java - JNI 字符串和 C 字符串

在JNI函数FindClass的文档中,我可以阅读有关参数name的信息:name:afully-qualifiedclassname(...)ThestringisencodedinmodifiedUTF-8.根据文档,修改后的UTF-8必须以双“\0”字符结尾:thenullcharacter(char)0isencodedusingthetwo-byteformatratherthantheone-byteformat这是否意味着我应该以这种方式从C中调用FindClass:FindClass("java/lang/String\0")即末尾有双'\0'?

java - JNI线程模型?

当我从Java调用C/C++时,JavaVM或JNI是否会创建一个新线程来运行C/C++代码,而我的Java线程正在等待?我问这个是因为我的C/C++代码在GPU上运行某些东西,我需要检查特定的缓冲区以取回结果。获得结果后,我需要再次调用我的Java函数。所以我在考虑在C++端创建一个线程,该线程不断检查缓冲区,一旦有一些数据可用,就会回调Java端。 最佳答案 JNI不会在后台创建任何新线程。native函数与调用native函数的java方法在同一线程中执行。反之亦然,当native代码调用java方法时,java方法与调用该方

java - 在 C++ 中的 Java native (JNI) 方法中,在 jdoubleArray 和 vector<double> 之间进行转换

我有一个C++dll,其中包含我需要在Java程序中使用的方法。我浏览了所有关于JNI的Sun文档,以及我在网上找到的大量教程,但我似乎无法找到我的代码的问题。事实上,相当一部分代码是从各种教程和Sun网站上剪切和粘贴的。我的具体问题如下:我的C++native方法从我的Java程序接收一个jdoubleArray,它需要映射到一个C++vector,然后该vector可以传递给C++dll中的一个方法。dll中的方法返回另一个vector,然后需要映射到一个新的jdoubleArray,并返回给Java程序。问题似乎是我没有正确执行映射。我的代码如下(为简单起见,我删除了对dll方法