簡體   English   中英

Android本機活動-調用Java方法

[英]Android Native Activity - Call Java method

我已經嘗試了一段時間,從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();
}


Java的:

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

com.thor.kalen.MainActivity.SendNotification()應該為com.thor.kalen.MainActivity類的jobject調用Java方法,而不是該對象的jclass :它不是靜態方法:

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)線程中顯示() AlertDialog。 您的C ++代碼建議您從后台線程執行操作。

如果此代碼在主線程上執行,則

main_activity->vm->DetachCurrentThread()

應該刪除。 AttachThread()也可以刪除,但是在已經連接的線程上調用時是NOP。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM