java – 从本机函数(c,jni)返回一个int会导致应用程序崩溃

前端之家收集整理的这篇文章主要介绍了java – 从本机函数(c,jni)返回一个int会导致应用程序崩溃前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
试图弄清楚为什么c函数调用返回一个int会导致整个应用程序崩溃而没有任何错误/警告.

这是工作代码

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,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,jint number)

public native Integer next(Integer number);

不符合. Integer是一个Object,而int是一个原语.

如果您的本机代码使用jint,那么您的java代码应该在本机方法的声明中使用int.

(如果你希望传递一个Integer,你需要将它视为本机的一个jobject,并跳过箍来访问它 – 它可能更容易使用int / jint并在Integer中进行任何必要的转换. java方面)

猜你在找的Java相关文章