【问题标题】:Android Native Activity - Call Java methodAndroid Native Activity - 调用 Java 方法
【发布时间】:2018-11-07 05:17:48
【问题描述】:

我一直在尝试从 c++ 调用 java 方法,我可以使用 Activity 类成功地做到这一点,但使用 NativeActivity,调用 CallVoidMethod 时它会崩溃。 GetMethodID 能够找到它,它返回一个地址。 env 和 vm 对象是有效的,并且是从 android_main() 填充的。它是否可能根本不适用于本机活动类?

Cpp:(已编辑)

void SendNotification() {

    JavaVM* lJavaVM = main_activity->vm;
    JNIEnv* lJNIEnv = main_activity->env;

    JavaVMAttachArgs lJavaVMAttachArgs;
    lJavaVMAttachArgs.version = JNI_VERSION_1_6;
    lJavaVMAttachArgs.name = "NativeThread";
    lJavaVMAttachArgs.group = NULL;

    jint lResult = lJavaVM->AttachCurrentThread(&lJNIEnv, &lJavaVMAttachArgs);
    if (lResult == JNI_ERR)
        return;

    jobject lNativeActivity = main_activity->clazz;
    jclass ClassNativeActivity = lJNIEnv->GetObjectClass(main_activity->clazz);
    jmethodID _method = lJNIEnv->GetMethodID(ClassNativeActivity, "SendNotification", "()V");

    lJNIEnv->CallVoidMethod(lNativeActivity, _method);

    lJavaVM->DetachCurrentThread();
}


爪哇:

package com.thor.kalen;

import android.app.AlertDialog;
import android.app.NativeActivity;
import android.os.Bundle;

public class MainActivity extends NativeActivity
{
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
    } // End of public void onCreate(Bundle savedInstanceState)

    public void SendNotification() {
        new AlertDialog.Builder(this).setTitle("Alert").setMessage("").setNeutralButton("Close", null).show();
    }
}

【问题讨论】:

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


    【解决方案1】:

    com.thor.kalen.MainActivity.SendNotification() 应该为 com.thor.kalen.MainActivity 类的 jobject 调用 Java 方法 strong>,不是这个对象的 jclass:它不是 static 方法:

    main_activity->env->CallVoidMethod(main_activity.clazz, _method)
    

    注意native_activity.h中的注释:

    /**
     * The NativeActivity object handle.
     *
     * IMPORTANT NOTE: This member is mis-named. It should really be named 
     * 'activity' instead of 'clazz', since it's a reference to the
     * NativeActivity instance created by the system for you.
     * 
     * We unfortunately cannot change this without breaking NDK
     * source-compatibility.
    */
    jobject clazz;
    

    此外,您只能在主 (UI) 线程中show() AlertDialog。您的 C++ 代码建议您从后台线程执行。

    如果这段代码在主线程上执行,那么

    main_activity->vm->DetachCurrentThread()
    

    应该被删除。 AttachThread() 也可以删除,但在已附加的线程上调用时它是 NOP。

    【讨论】:

    • 我尝试将警报对话框替换为 int x=0;它仍然崩溃,看起来它甚至没有到达那里。
    • 另外,我从 android_main 调用它。
    • 你是对的!我把对象和类弄混了,它现在可以工作了,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 2016-08-29
    相关资源
    最近更新 更多