2012-05-14 6 views
6

intを返すC++関数呼び出しがエラー/警告なしでアプリケーション全体をクラッシュさせる理由を理解しようとしています。ここでネイティブ関数(C++、jni)から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; 
    } 

をこのコードは警告なしにアプリケーションをクラッシュ:

私は

ログ猫で私のログメッセージ(__ android_log_print)を見ることができるアプリケーションがクラッシュする前に

    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; 
    } 

EDIT: "number + test"を "1"に置き換えても、アプリケーションはまだクラッシュする... これは唯一のものですKS私は "数" を返した場合...

EDIT#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"); 
    } 
} 
+0

スタックスマッシュ、または他の種類のメモリの問題? –

+0

JVMからダンプを取得し、正確に何が起きているのかを調べます。ホットスポットの下には、これらの問題をデバッグするためのオプションがありますが、アンドロイドについては考えられません。ここのコードは問題ありません。問題は他の場所です。 – Voo

+0

迅速な対応をありがとう、みんな!私は明日それを試してみます... – 6opuc

答えて

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

public native Integer next(Integer number); 

一致しないでください。 の整数がオブジェクトであり、がプリミティブです。

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

(Integerを渡したい場合は、それをネイティブ側のjobjectとして扱い、フープをジャンプしてアクセスする必要があります。おそらくint/jintを使用して、整数からのJava側)

+0

ガー、あなたは数秒でそれに私を打ち負かす。よくやった! –

+0

ありがとう!私が最初にドキュメントを読むなら、私にとっては良いでしょう;)今日はそれを試してみます – 6opuc

+0

整数をintに変更しました。ありがとう! – 6opuc

関連する問題