2012-05-14 31 views
6

Cố gắng tìm ra lý do tại sao hàm C++ trả về một lỗi trong toàn bộ ứng dụng mà không có bất kỳ lỗi/cảnh báo nào.Trả về một hàm int từ hàm gốc (C++, jni) treo ứng dụng

đây đang làm việc mã:


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

Và mã này bị treo ứng dụng mà không cần cảnh báo:


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

Trước khi ứng dụng bị treo tôi có thể thấy thông tin đăng nhập của tôi (__ android_log_print) trong nhật ký mèo

EDIT: Thậm chí nếu tôi thay thế "kiểm tra số" bằng "1" thì ứng dụng vẫn bị lỗi ... Chỉ có wor ks nếu tôi trở về "số" ...

EDIT # 2: mã Java-side:


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

ngăn xếp bị hỏng hoặc các loại vấn đề bộ nhớ khác? –

+0

Lấy một bãi chứa từ JVM và xem chính xác những gì đang xảy ra. Dưới Hotspot có các tùy chọn để gỡ lỗi những vấn đề này - không có ý tưởng về android mặc dù. Mã ở đây là tốt, vấn đề là ở nơi khác. – Voo

+0

Cảm ơn bạn đã trả lời nhanh, các bạn! Tôi sẽ cố gắng vào ngày mai ... – 6opuc

Trả lời

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

public native Integer next(Integer number); 

Đừng phù hợp. An Số nguyên là một đối tượng, trong khi int là nguyên thủy.

Nếu mã gốc của bạn sử dụng jint, mã java của bạn nên sử dụng int trong khai báo phương pháp gốc.

(Nếu bạn muốn vượt qua Số nguyên, bạn sẽ cần xử lý nó dưới dạng công việc ở bên gốc và nhảy qua hoops để truy cập nó - có thể dễ dàng hơn để sử dụng int/jint và thực hiện bất kỳ chuyển đổi cần thiết nào từ Integer ở phía java)

+0

Rất tiếc, bạn đã đánh bại tôi trong vài giây. Làm tốt! –

+0

Cảm ơn rất nhiều! Nó sẽ là tốt hơn cho tôi nếu tôi đọc tài liệu đầu tiên;) Tôi sẽ thử rằng ngày hôm nay – 6opuc

+0

Thay đổi Integer để int và nó hoạt động ngay bây giờ! Cảm ơn! – 6opuc