Android ndk 如何调用java函数并从c++;使用androidndk 我尝试从我的C++代码调用java函数,但是应用程序保持“崩溃”。 首先,我通过JNI调用启动C++代码,它没有任何问题。然后让被调用的函数执行回调: #include <jni.h> extern "C" JNIEXPORT jstring JNICALL Java_net_example_folder_Service_startSomething(JNIEnv *env, jobject obj) { invoke_class(env); return env->NewStringUTF("The End.\n"); //works if I only use this line }

Android ndk 如何调用java函数并从c++;使用androidndk 我尝试从我的C++代码调用java函数,但是应用程序保持“崩溃”。 首先,我通过JNI调用启动C++代码,它没有任何问题。然后让被调用的函数执行回调: #include <jni.h> extern "C" JNIEXPORT jstring JNICALL Java_net_example_folder_Service_startSomething(JNIEnv *env, jobject obj) { invoke_class(env); return env->NewStringUTF("The End.\n"); //works if I only use this line },android-ndk,java-native-interface,Android Ndk,Java Native Interface,要调用java代码: package net.example.folder; import android.util.Log; public class helloWorldClass { public static void helloWorld() { Log.e("helloWorldCLass", "Hello World!"); } } C++代码由后台服务调用。以下是启动它的活动的功能: public void startService() {

要调用java代码:

package net.example.folder;

import android.util.Log;

public class helloWorldClass {
    public static void helloWorld() {
        Log.e("helloWorldCLass", "Hello World!");
    }
}

C++代码由后台服务调用。以下是启动它的活动的功能:

public void startService() {
    Intent i = new Intent(this, Service.class);
    startService(i);
}
这是服务的一部分:

public class SimService extends IntentService {

    ...

    @Override
    protected void onHandleIntent(Intent intent) {
        System.loadLibrary("native-lib");
        startSomething();
    }
}
这一切都是可行的,但当我现在将函数“invoke_class”更改为:

void invoke_class(JNIEnv* env) {
    jclass helloWorldClass;
    jmethodID mainMethod;

    helloWorldClass = env->FindClass("net/example/folder/helloWorldClass");

    mainMethod = env->GetStaticMethodID(helloWorldClass, "helloWorld", "([Ljava/lang/String;)V");

    env->CallStaticVoidMethod(helloWorldClass, mainMethod, env->NewStringUTF("some text"));
}
当然,java部分要:

package net.example.folder;

import android.util.Log;

public class helloWorldClass {
    public static void helloWorld(String msg) {
        Log.e("helloWorldCLass", msg);
    }
}
有了这些,我将得到前面提到的崩溃


为什么呢?如何正确传递参数?

Symbol
[
用于表示数组(就好像您有字符串[]msg),请从GetStaticMethodID方法中删除它

您可以查看有关的更多信息

正如Michael所说,您应该检查本机代码中的java异常,否则您的应用程序将崩溃。您可以使用。例如:

jclass exClass = env->FindClass("some/random/class");
if (exClass == nullptr || env->ExceptionOccurred()) {
    env->ExceptionClear();
    // do smth in case of failure
}

符号
[
用于表示数组(就好像您有字符串[]msg),请从GetStaticMethodID方法中删除它

您可以查看有关的更多信息

正如Michael所说,您应该检查本机代码中的java异常,否则您的应用程序将崩溃。您可以使用。例如:

jclass exClass = env->FindClass("some/random/class");
if (exClass == nullptr || env->ExceptionOccurred()) {
    env->ExceptionClear();
    // do smth in case of failure
}

[
用于表示数组(就像您有字符串[]msg一样),将其从
GetStaticMethodID
方法中删除。当然,还要为所有JNI调用添加错误检查。不要只是假设它们会成功。谢谢,如果没有
[
它会工作。错误检查类似于
if(main method!=0)
然后才运行代码?它仍然会导致我的应用程序崩溃,因为一些“JNI错误”
[
用于表示数组(就像您有字符串[]msg一样),将其从您的
GetStaticMethodID
方法中删除。当然,还要为所有JNI调用添加错误检查。不要只是假设它们会成功。谢谢,如果没有
[
,它会起作用。错误检查如
if(mainMethod!=0)
,然后才运行代码?由于某些原因,它仍然会导致我的应用程序崩溃如果类/方法不存在或找不到,则“JNI Error”EXOPERSS的值为NULL。至少在我的情况下是这样。因此如果(EXOPERSS==NULL | | |…)对我来说是这样。如果类/方法不存在或找不到,EXOPERSS的值为NULL。至少在我的情况下是这样。如果(EXOPERSS==NULL | |…)对我来说是这样。