从Android原生c+;调用静态Java方法+;代码 我有一个静态java函数,我想从本地C++的Android代码调用。
Java方法:从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
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代码的有效期(“虚拟”)。