从Android原生c+;调用静态Java方法+;代码 我有一个静态java函数,我想从本地C++的Android代码调用。

从Android原生c+;调用静态Java方法+;代码 我有一个静态java函数,我想从本地C++的Android代码调用。,java,android,c++,android-ndk,java-native-interface,Java,Android,C++,Android Ndk,Java Native Interface,Java方法: package com.verizon.freebeesdk; public class Session { public static void checkExpiry(String s){ Log.d("CALLED FROM JNI",s); } } C++代码: static JNIEnv* __getEnv(bool* attached) { JNIEnv* env = NULL; *attached = false; int r

Java方法:

package com.verizon.freebeesdk;

public class Session {
    public static void checkExpiry(String s){

        Log.d("CALLED FROM JNI",s);

    }
}
C++代码:

static JNIEnv* __getEnv(bool* attached)
{
JNIEnv* env = NULL;
*attached = false;
int ret = __java_vm->GetEnv((void**)&env, JNI_VERSION_1_4);
if (ret == JNI_EDETACHED) {
    if (0 != __java_vm->AttachCurrentThread(&env, NULL)) {
        return NULL;
    }
    *attached = true;
    return env;
}

if (ret != JNI_OK) {
    return NULL;
}

return env;
}

void __check_expiry(){

JNIEnv* env = NULL;
static bool __is_attached_1 = false;

if ((env = __getEnv(&__is_attached_1)) == NULL) {
    log_info("getEnv fail\r\n");
}
assert(!__is_attached_1);

jstring jstr = env->NewStringUTF("This string comes from JNI");
log_info("CHECK EXPIRY: %s ",env->GetStringUTFChars(jstr ,0));

jclass clazz = env->FindClass("com/verizon/freebeesdk/Session");
if(clazz == 0){
    log_info("This class not found");
}
jmethodID mid = env->GetStaticMethodID(clazz, "checkExpiry", "(Ljava/lang/String;)V");
env->CallStaticVoidMethod(clazz, mid, jstr);
}
输出:

我总是得到“未找到此类”语句,随后出现错误:

java.lang.NoClassDefFoundError:使用引导类加载程序找不到类;没有可用的堆栈跟踪

JNIEnv设置正确,因为第一个log语句正确地打印“CHECK EXPIRY:此字符串来自JNI”

有人能帮我吗


谢谢。

首先,您的标题不准确,因为您的问题(至少是您现在面临的问题)不是调用静态函数,而是查找会话类


尽管获取类的代码似乎是正确的,但可能还有其他原因导致找不到该类,例如类加载器问题-请查看JNI文档,看看是否有帮助:

因此在类路径上找不到该类。所以要解决这个问题。您的错误处理不正确。如果您得到一个错误,您只需记录它,然后继续,就好像它没有发生一样。你不可能希望侥幸逃脱。你的本机代码是如何调用的?可能此时会话类尚未加载。尝试将呼叫添加到会话。在加载本机库之前,请先检查Java代码的有效期(“虚拟”)。