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

时间:2012-05-14 18:04:26

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

试图找出为什么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, 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)

编辑: 即使我将“number + test”替换为“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");
    }
}

1 个答案:

答案 0 :(得分:13)

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

public native Integer next(Integer number);

不匹配。 Integer 是一个Object,而 int 是一个原语。

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

(如果你希望传递一个Integer,你需要把它当作本地的一个jobject,并跳过箍来访问它 - 它可能更容易使用int / jint并做任何必要的转换来自java方面的整数)