我有一个静态java函数,我想从Native C ++ Android代码调用。
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,因为第一个日志语句正确打印“检查EXPIRY:此字符串来自JNI”
有人可以帮助我吗?
感谢。
答案 0 :(得分:0)
首先,你的标题不准确,因为你的问题(至少是你现在面临的问题)不是关于调用静态函数,而是关于查找Session类。
虽然您获取该类的代码似乎是正确的,但可能还有其他原因导致无法找到该类,例如类加载器问题 - 请查看相关的JNI文档,看看它是否有帮助:{{3} }