当前位置: 首页 > 面试题库 >

在Android中从C ++调用Java方法

葛驰
2023-03-14
问题内容

我试图从C ++获得一个简单的Java方法调用,而Java调用本机方法。这是Java代码:

public class MainActivity extends Activity {
    private static String LIB_NAME = "name";

    static {
        System.loadLibrary(LIB_NAME);
    }

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView tv = (TextView) findViewById(R.id.textview);
        tv.setText(this.getJniString());
    }

    public void messageMe(String text) {
        System.out.println(text);
    }

    public native String getJniString();
}

我试图messageMegetJniString*从Java到本机的方法调用过程中从本机代码调用方法。

native.cpp:

#include <string.h>
#include <stdio.h>
#include <jni.h>

jstring Java_the_package_MainActivity_getJniString( JNIEnv* env, jobject obj, jint depth ){

//    JavaVM *vm;
//    JNIEnv *env;
//    JavaVMInitArgs vm_args;
//    vm_args.version = JNI_VERSION_1_2;
//    vm_args.nOptions = 0;
//    vm_args.ignoreUnrecognized = 1;
//
//    // Construct a VM
//    jint res = JNI_CreateJavaVM(&vm, (void **)&env, &vm_args);

    // Construct a String
    jstring jstr = env->NewStringUTF("This string comes from JNI");
    // First get the class that contains the method you need to call
    jclass clazz = env->FindClass("the/package/MainActivity");
    // Get the method that you want to call
    jmethodID messageMe = env->GetMethodID(clazz, "messageMe", "(Ljava/lang/String;)V");
    // Call the method on the object
    jobject result = env->CallObjectMethod(jstr, messageMe);
    // Get a C-style string
    const char* str = env->GetStringUTFChars((jstring) result, NULL);
    printf("%s\n", str);
        // Clean up
    env->ReleaseStringUTFChars(jstr, str);

//    // Shutdown the VM.
//    vm->DestroyJavaVM();

    return env->NewStringUTF("Hello from JNI!");
}

干净的编译应用停止并显示下一条消息后:

ERROR/AndroidRuntime(742): FATAL EXCEPTION: main
        java.lang.NoSuchMethodError: messageMe
        at *.android.t3d.MainActivity.getJniString(Native Method)
        at *.android.t3d.MainActivity.onCreate(MainActivity.java:22)

显然,这意味着方法名称错误,但对我来说似乎不错。


问题答案:

如果是对象方法,则需要将该对象传递给CallObjectMethod

jobject result = env->CallObjectMethod(obj, messageMe, jstr);

你正在做什么相当于jstr.messageMe()

由于你的方法无效,因此应调用:

env->CallVoidMethod(obj, messageMe, jstr);

如果要返回结果,则需要更改JNI签名(()V意味着void返回类型的方法)以及Java代码中的返回类型。



 类似资料:
  • 问题内容: 因此,我正在编写一个使用大型c 库的Android应用。我可以正常工作,以便Java应用程序可以调用c 委托方法,但是我发现自己希望自己可以将来自c 的消息记录到Android日志中。从Java上这很容易,但是我不知道如何从c 调用Java方法。我的搜索找到了从c 打开jvm的方法,这根本不是我想要做的。理想情况下,我想将日志方法指针传递给c ,然后可以在需要时使用它。当然,Java不

  • 问题内容: 我正在尝试从C 调用python类中的方法。调用它的C 方法是C ++回调。 在此方法中,当我尝试调用python方法时,它给出了。 我已经将python函数的实例保存在全局变量中,例如 python方法在哪里,将在回调中使用。 在回调中,参数创建为 创建时 在这一行中,它给出了细分错误。之后,实际的python方法称为 问题答案: 如果要从C / C ++回调中调用Python函数,

  • 问题内容: 我尝试在Android NDK上工作,我的第一个测试不是很确定,我需要帮助,因为我看不到错误在哪里。 以下代码可以毫无问题地进行编译,但是当在模拟器上运行时,该程序将返回SIGSEGV信号,并且在logcat中不会显式写入任何错误。但是,将显示一条警告,指出未找到Java类。经过一天的研究,这个问题看起来一切正确。 这是我的Java代码:JNITestActivity.java 这是我

  • 问题内容: 我正在将Java用于小型应用程序。这是对现有MFC项目的重写。我需要更改一个现有的dll,以启用使用JNI从Java进行的访问。所有这些Java知识对我来说都是新手,因此当我阅读其他论坛帖子时遇到了一些麻烦,并且感觉比较密集。在现有的dll中,我具有如下功能: 愚蠢的提问时间。如何正确设置它以被Java调用? 我尝试了这个: 我包括jni.h,一切编译正常。但是,当我从Java调用它时

  • 我有一个Foo和Bar对象的列表,以及每个相应对象的转换器。 Convert-method需要有所不同,因为Bar1与Bar2和Bar3等有很大不同,但是我想创建一个方法来处理所有可能的列表。 是否可以创建一个泛型方法,根据列表的内容调用相应的非泛型方法? 到目前为止,我已经尝试过了: 但这并不能编译,因为"无法解析方法'Converts(T, S)'" 有什么想法吗?

  • 问题内容: 有没有人能将C#代码集成到Java应用程序中呢? 代码很小,所以我可以用Java重写,但是如果可能的话,我宁愿重用代码。不要重复自己,等等。 另外,我知道我可以将C#公开为Web服务或其他任何东西,但是其中包含一些安全性/加密功能,因此,我宁愿将其紧密集成。 编辑:它将在基于服务器的应用程序上,因此“下载”另一个运行时是无关紧要的。 问题答案: 有一个IL到Java字节码编译器Gras