Android NDK:从C ++调用Java函数 [英] Android NDK: Calling Java functions from C++

查看:145
本文介绍了Android NDK:从C ++调用Java函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对JNI非常新,我想弄清楚某些东西在我将C ++ iOS代码移植到它之前如何工作。我成功地得到一个NDK样本在Android studio中工作,我可以看到Java是如何能够调用C ++函数。



我一直在搜索并获取大块代码,但是我无法在我的具体实现中使用它。



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



这是我的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:致命信号11(SIGSEGV)0x00000000 = 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 ,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);
}

//在一些初始化函数中使用环境变量

env-> GetJavaVM(& g_JavaVM);希望这可以帮助有同样问题的其他人。


I am very new to JNI and I am trying to figure out how certain things work before I port my C++ iOS code to it. I was successful in getting one of the NDK samples working in Android studio and I can see how Java is able to call C++ functions.

I've been searching around and taking chunks of code, but I haven't been able to get it to work in my specific implementation.

Just to test how things worked I set up a simple text log function in java, and I am trying to call it from my native code but I've run into issues.

Here is my Java function:

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

And 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);
}

From what I've seen with different examples this should work, but it throws an error:

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

Am I missing something?

EDIT:

I've changed it to GetStaticMethodID. But after logging the progress of the function I've found out that the line that fails is:

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

Which I figure is because g_JavaVM is set as static JavaVM* g_JavaVM = NULL; and then never touched again. I'm guessing I need to set this variable, but how?

解决方案

Part of my problem was that I didn't initialize The JavaVM. The other part was that I was using C++, but I was trying to use the C functions.

The working code is:

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);

Hopefully this can help other people with the same problem.

这篇关于Android NDK:从C ++调用Java函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆