java - 从 native 函数(c++、jni)返回一个 int 会使应用程序崩溃

标签 java android c++ android-ndk java-native-interface

试图找出为什么返回 int 的 c++ 函数调用会导致整个应用程序崩溃而没有任何错误/警告。

这是工作代码:


    jint Java_org_ntorrent_DummyTorrentInfoProvider_next(
            JNIEnv * env, jobject obj, jint number)
    {
        jint test = rand();
        __android_log_print(ANDROID_LOG_DEBUG, "HelloNDK!", "rand() = %d", test);

        return number;
    }

这段代码在没有警告的情况下使应用程序崩溃:


    jint Java_org_ntorrent_DummyTorrentInfoProvider_next(
            JNIEnv * env, jobject obj, jint number)
    {
        jint test = rand();
        __android_log_print(ANDROID_LOG_DEBUG, "HelloNDK!", "rand() = %d", test);

        return number + test;
    }

在应用程序崩溃之前,我可以在 log cat 中看到我的日志消息 (__android_log_print)

编辑: 即使我用“1”替换“数字+测试”,应用程序仍然崩溃...... 它只有在我返回“数字”时才有效...

编辑#2:Java 端代码:


package org.ntorrent;

import java.util.ArrayList;
import java.util.Random;

public class DummyTorrentInfoProvider implements TorrentInfoProvider {

    public native Integer next(Integer number);

    //public Integer next() { return _random.nextInt(); }

    public native void test();

    private Random _random = new Random(100);

    @Override
    public ArrayList getTorrents() {
        test();
        ArrayList torrents = new ArrayList();
        torrents.add(
                new TorrentInfo("test torrent number 1", next(1),  3f, 5f));
        torrents.add(
                new TorrentInfo("test torrent number 2", next(2), 4f, 15f));
        torrents.add(
                new TorrentInfo("test torrent number 555"));
        torrents.add(
                new TorrentInfo("test torrent number 3", next(3), 13f, 5f));
        return torrents;
    }

    static {
        System.loadLibrary("test");
    }
}

最佳答案

jint Java_org_ntorrent_DummyTorrentInfoProvider_next(
    JNIEnv * env, jobject obj, jint number)

public native Integer next(Integer number);

不匹配。 Integer 是对象,而 int 是原始类型。

如果您的 native 代码使用jint,您的java 代码应该在 native 方法的声明中使用int

(如果你想传递一个整数,你需要在 native 端将它视为一个工作对象,并跳过箍来访问它 - 使用 int/jint 并进行任何必要的转换可能更容易从java端的整数)

关于java - 从 native 函数(c++、jni)返回一个 int 会使应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10588665/

相关文章:

java - 隐藏正在运行的Java窗口?

java - Spring Rest 存储库 -> 如何动态省略响应中的字段

java - 测试包不读取主包中定义的 Kotlin 类

android - 将应用程序快速部署到 Android 模拟器总是失败

从文件到 8 位字符到文件的 C++ 32 位整数-程序在某个整数处崩溃

java - 如何从 HashMap 中删除元素而不出现 ConcurrentModificationException

java - 舞台任务栏中的低质量图标。 JavaFX

java - 多线程服务器如何工作?

c++ - 为什么我不能用这个其他类的函数来填充这个类的函数指针

c++ - 无法通过 QModelIndex 从 QTreeView 获取项目