从Android本机c ++代码调用静态Java方法

时间:2017-06-30 20:19:59

标签: java android c++ android-ndk java-native-interface

我有一个静态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”

有人可以帮助我吗?

感谢。

1 个答案:

答案 0 :(得分:0)

首先,你的标题不准确,因为你的问题(至少是你现在面临的问题)不是关于调用静态函数,而是关于查找Session类。

虽然您获取该类的代码似乎是正确的,但可能还有其他原因导致无法找到该类,例如类加载器问题 - 请查看相关的JNI文档,看看它是否有帮助:{{3} }