JNI 中 jclass 的类名

问题描述 投票:0回答:2

这可能是一个愚蠢的问题,暴露出对 JNI 缺乏理解。我正在编写一个封装 Java VM 的 C++ 程序:我使用 CallVoidMethod 等调用来调用 VM 内的函数。这纯粹是背景知识,与问题不太相关。

我希望能够找到给定 jclass 实例的 Java 类的名称。有什么办法可以做到这一点吗?我可以像在 Java 程序中那样调用 GetName 函数吗?

java-native-interface
2个回答
18
投票

jclass
实例是您的对象,将在其上调用方法;您需要在
getName
类上查找
Class
方法 ID,然后使用
jclass
CallObjectMethod
实例上调用它,以获得
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);

3
投票

受到已接受答案的启发,我设置了一个符合我目的的函数

/**
 * 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.