2023-01-19 397
这可能是一个愚蠢的问题,揭示了对JNI缺乏理解.我正在编写一个封装Java VM的C ++程序:我正在使用CallVoidMethod等呼叫在VM中调用功能.这纯粹是背景,与问题不太相关.
我希望能够找到给定JCLASS实例的Java类的名称.有什么办法做到这一点吗?我可以像在Java程序中那样调用getName函数吗?
jclass实例是您的对象,将调用方法.您需要在Class类上查找getName方法ID,然后使用CallObjectMethod在jclass实例上调用它以获取jstring结果.
简而
编辑
(错误处理)
JNIEnv* env = ...;
// substitute your desired class's specifier for "java/lang/Class"...
jclass cls = env->FindClass("java/lang/Class");
jmethodID mid_getName = env->GetMethodID(cls, "getName", "()Ljava/lang/String;");
jstring name = env->CallObjectMethod(cls, mid_getName);
受接受答案的启发,我放置了适合我的目的的功能
/**
* JNI/C++: Get Class Name
* @param env [in] JNI context
* @param myCls [in] Class object, which the name is asked of
* @param fullpath [in] true for full class path, else name without package context
* @return Name of class myCls, encoding UTF-8
*/
std::string getClassName(JNIEnv* env, jclass myCls, bool fullpath)
{
jclass ccls = env->FindClass("java/lang/Class");
jmethodID mid_getName = env->GetMethodID(ccls, "getName", "()Ljava/lang/String;");
jstring strObj = (jstring)env->CallObjectMethod(myCls, mid_getName);
const char* localName = env->GetStringUTFChars(strObj, 0);
std::string res = localName;
env->ReleaseStringUTFChars(strObj, localName);
if (!fullpath)
{
std::size_t pos = res.find_last_of('.');
if (pos!=std::string::npos)
{
res = res.substr(pos+1);
}
}
return res;
}
以上所述是小编给大家介绍的JNI中jclass的类名,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!
原文链接:https://77isp.com/post/25774.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态