【发布时间】:2012-02-13 17:58:39
【问题描述】:
这可能是一个愚蠢的问题,表明对 JNI 缺乏了解。我正在编写一个封装 Java VM 的 C++ 程序:我正在使用诸如 CallVoidMethod 之类的调用来调用 VM 中的函数。这纯粹是背景,与问题不太相关。
我希望能够找到给定 jclass 实例的 Java 类的名称。有没有办法做到这一点?我可以像在 Java 程序中那样调用 GetName 函数吗?
【问题讨论】:
这可能是一个愚蠢的问题,表明对 JNI 缺乏了解。我正在编写一个封装 Java VM 的 C++ 程序:我正在使用诸如 CallVoidMethod 之类的调用来调用 VM 中的函数。这纯粹是背景,与问题不太相关。
我希望能够找到给定 jclass 实例的 Java 类的名称。有没有办法做到这一点?我可以像在 Java 程序中那样调用 GetName 函数吗?
【问题讨论】:
jclass 实例是将调用方法的对象;您需要在Class 类上查找getName 方法ID,然后使用CallObjectMethod 在jclass 实例上调用它以获得jstring 结果。
简而言之,是的,您只需调用getName 函数并查看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);
【讨论】:
getClass(),然后再使用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;
}
【讨论】: