java - 安卓NDK : Calling Java functions from C++

标签 java android c++ android-ndk

我是 JNI 的新手,在将我的 C++ iOS 代码移植到 JNI 之前,我想弄清楚某些事情是如何工作的。我成功地让 NDK 示例之一在 Android Studio 中运行,我可以看到 Java 如何调用 C++ 函数。

我一直在四处搜索并获取大量代码,但我无法让它在我的特定实现中工作。

为了测试它是如何工作的,我在 java 中设置了一个简单的文本日志函数,我试图从我的 native 代码调用它,但我遇到了问题。

这是我的 Java 函数:

public static void log(String s){
        Log.d("Native", s);
}

和 C++:

void Log(std::string s){

    JNIEnv *env;
    g_JavaVM->GetEnv((void**)&env, JNI_VERSION_1_6);

    jstring jstr1 = env->NewStringUTF(s.c_str());

    jclass clazz = env->FindClass("com/android/gl2jni/GL2JNILib");
    jmethodID mid = env->GetStaticMethodID(clazz, "log", "(Ljava/lang/String;)V");

    jobject obj = env->CallStaticObjectMethod(clazz, mid, jstr1);
}

根据我在不同示例中看到的情况,这应该可行,但会引发错误:

29835-29849/com.android.gl2jni A/libc﹕ Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 29849 (Thread-17371)

我错过了什么吗?

编辑:

我已将其更改为 GetStaticMethodID。但是在记录函数的进度后,我发现失败的行是:

g_JavaVM->GetEnv((void**)&env, JNI_VERSION_1_6);

我认为这是因为 g_JavaVM 被设置为 static JavaVM* g_JavaVM = NULL; 然后再也没有碰过。我想我需要设置这个变量,但如何设置?

最佳答案

我的部分问题是我没有初始化 JavaVM。另一部分是我使用的是 C++,但我正在尝试使用 C 函数。

工作代码是:

Java:

public static void log(String s){
        Log.d("Native", s);
}

C++:

void Log(std::string s){

    JNIEnv *env;
    g_JavaVM->GetEnv((void**)&env, JNI_VERSION_1_6);

    jstring jstr1 = env->NewStringUTF(s.c_str());

    jclass clazz = env->FindClass("com/android/gl2jni/GL2JNILib");
    jmethodID mid = env->GetStaticMethodID(clazz, "log", "(Ljava/lang/String;)V");

    jobject obj = env->CallStaticObjectMethod(clazz, mid, jstr1);
}

//In some initialization function with Environment variable

env->GetJavaVM(&g_JavaVM);

希望这可以帮助其他遇到同样问题的人。

关于java - 安卓NDK : Calling Java functions from C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28622036/

相关文章:

java - Storm : Spout for reading data from a port

java - Android Studio 1.1.0 + Robolectric 2.4 导致 java.lang.annotation.AnnotationFormatError

android - 如何在android中创建自己的wifi热点

c++ - 奇怪的符号、文本和实际字符在数组中消失/改变

c++ - linux中的子进程shell

java - Junit和Ant集成的另一个简单问题

java - Java 中的对象池

android - 将 Chromecast 支持添加到 Android 应用程序时出现问题

c++ - 在 CUDA C 项目中使用 C++

java - ajax请求后渲染页面