2012-05-14 13 views
6

यह पता लगाने की कोशिश कर रहा है कि क्यों एक 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, jobject obj, jint number) 
    { 
     jint test = rand(); 
     __android_log_print(ANDROID_LOG_DEBUG, "HelloNDK!", "rand() = %d", test); 

     return number + test; 
    } 

अनुप्रयोग क्रैश से पहले मैं लॉग बिल्ली में मेरी लॉग संदेश (__ android_log_print) देख सकते हैं

संपादित करें: भले ही मैं "नंबर + परीक्षण" को "1" के साथ प्रतिस्थापित करता हूं, फिर भी एप्लिकेशन क्रैश हो रहा है ... यह केवल खराब है ks अगर मैं "संख्या" ...

संपादित करें # 2 वापसी: जावा-साइड कोड:


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

जेवीएम से डंप प्राप्त करें और देखें कि वास्तव में क्या हो रहा है। हॉटस्पॉट के तहत इन समस्याओं को डीबग करने के विकल्प हैं - हालांकि एंड्रॉइड के बारे में कोई जानकारी नहीं है। यहां कोड ठीक है, समस्या कहीं और है। – Voo

+0

त्वरित प्रतिक्रियाओं के लिए धन्यवाद, दोस्तों! मैं कल कोशिश करूँगा ... – 6opuc

उत्तर

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

और

public native Integer next(Integer number); 

मेल नहीं खाते। एक पूर्णांक एक वस्तु है, जबकि int एक आदिम है।

अपने मूल कोड jint का उपयोग करता है, तो अपने जावा कोड देशी पद्धति की घोषणा में पूर्णांक उपयोग करना चाहिए।

(यदि आप एक इंटीजर पास करना चाहते हैं, तो आपको इसे देशी पक्ष में नौकरी के रूप में पेश करने की आवश्यकता होगी, और इसे एक्सेस करने के लिए हुप्स के माध्यम से कूदना होगा - यह संभवतः int/jint का उपयोग करना आसान है और किसी भी आवश्यक रूपांतरण को करना आसान है जावा पक्ष में इंटीजर से)

+0

गाह, आपने मुझे कुछ सेकंड तक मार दिया। बहुत बढ़िया! –

+0

बहुत बहुत धन्यवाद! अगर मैं पहले दस्तावेज पढ़ता हूं तो यह मेरे लिए बेहतर होगा;) मैं आज कोशिश करूँगा – 6opuc

+0

int में इंटीजर बदल गया और यह अब काम करता है! धन्यवाद! – 6opuc

संबंधित मुद्दे