7

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)を確認できます

編集:「number + test」を「1」に置き換えても、アプリケーションはクラッシュします...「number」を返した場合にのみ機能します...

編集#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");
    }
}
4

1 に答える 1

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

public native Integer next(Integer number);

一致しない。整数はオブジェクトですが、整数プリミティブです。

ネイティブコードがjintを使用している場合、Javaコードはネイティブメソッドの宣言で intを使用する必要があります。

(整数を渡したい場合は、ネイティブ側でそれをジョブジェクトとして扱い、フープをジャンプしてアクセスする必要があります-int / jintを使用して、整数から整数に必要な変換を行う方がおそらく簡単です。 java側)

于 2012-05-14T19:05:24.057 に答える