2011-05-05 7 views
5

मैं इस मार्गदर्शिका का अनुसरण कर रहा हूं कि LAME लाइब्रेरी के साथ और एंड्रॉइड एनडीके को पोर्ट कैसे करें। http://blog.libertadtech.com/2011/02/porting-lame-encoder-to-android-arm.htmlपोर्टेड लाइब्रेरी के मूल कार्यों को आमंत्रित करना

प्रत्येक काम ठीक है, मुझे libmp3lame.so फ़ाइल मिली है।

void get_lame_version(char *strbuf, size_t buflen, const char *prefix); 

मैं लंगड़ा पुस्तकालय के लिए एक आवरण लिखा है:

package de.goddchen.android.youtubeconverter; 

public class LameWrapper { 

public static native void get_1lame_1version(char[] buf, int len, 
     char[] prefix); 
} 

और मैं इसे इस तरह कहते हैं:

अब एक पहले टेस्ट के लिए मैं साधारण समारोह कॉल करने के लिए चाहता था

public class MainActivity extends Activity { 

static { 
    System.loadLibrary("mp3lame"); 
} 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     char[] buffer = new char[100]; 
     LameWrapper.get_1lame_1version(buffer, 100, "".toCharArray()); 
     ((TextView) findViewById(R.id.text)).setText(buffer.toString()); 
    } 

} 

लेकिन मुझे निम्न त्रुटि मिलती है:

05-05 10:36:11.973: DEBUG/dalvikvm(199): Trying to load lib /data/data/de.goddchen.android.youtubeconverter/lib/libmp3lame.so 0x43757f78 
05-05 10:36:12.053: DEBUG/dalvikvm(199): Added shared lib /data/data/de.goddchen.android.youtubeconverter/lib/libmp3lame.so 0x43757f78 
05-05 10:36:12.123: DEBUG/dalvikvm(199): No JNI_OnLoad found in /data/data/de.goddchen.android.youtubeconverter/lib/libmp3lame.so 0x43757f78 
05-05 10:36:12.573: DEBUG/dalvikvm(199): +++ not scanning '/system/lib/libwebcore.so' for 'get_1lame_1version' (wrong CL) 
05-05 10:36:12.693: DEBUG/dalvikvm(199): +++ not scanning '/system/lib/libexif.so' for 'get_1lame_1version' (wrong CL) 
05-05 10:36:12.693: DEBUG/dalvikvm(199): +++ not scanning '/system/lib/libFFTEm.so' for 'get_1lame_1version' (wrong CL) 
05-05 10:36:12.703: DEBUG/dalvikvm(199): +++ not scanning '/system/lib/libmedia_jni.so' for 'get_1lame_1version' (wrong CL) 
05-05 10:36:12.703: DEBUG/dalvikvm(199): +++ not scanning '/system/lib/libsrec_jni.so' for 'get_1lame_1version' (wrong CL) 
05-05 10:36:12.703: WARN/dalvikvm(199): No implementation found for native Lde/goddchen/android/youtubeconverter/LameWrapper;.get_1lame_1version ([CI[C)V 
05-05 10:36:12.703: DEBUG/AndroidRuntime(199): Shutting down VM 
05-05 10:36:12.753: INFO/ActivityManager(52): Start proc com.android.alarmclock for broadcast com.android.alarmclock/.AlarmInitReceiver: pid=213 uid=10017 gids={} 
05-05 10:36:12.773: WARN/dalvikvm(199): threadid=3: thread exiting with uncaught exception (group=0x4001aa28) 
05-05 10:36:12.783: ERROR/AndroidRuntime(199): Uncaught handler: thread main exiting due to uncaught exception 
05-05 10:36:12.883: ERROR/AndroidRuntime(199): java.lang.UnsatisfiedLinkError: get_1lame_1version 
05-05 10:36:12.883: ERROR/AndroidRuntime(199):  at de.goddchen.android.youtubeconverter.LameWrapper.get_1lame_1version(Native Method) 
05-05 10:36:12.883: ERROR/AndroidRuntime(199):  at de.goddchen.android.youtubeconverter.MainActivity.onCreate(MainActivity.java:19) 
05-05 10:36:12.883: ERROR/AndroidRuntime(199):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123) 
05-05 10:36:12.883: ERROR/AndroidRuntime(199):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364) 
05-05 10:36:12.883: ERROR/AndroidRuntime(199):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417) 
05-05 10:36:12.883: ERROR/AndroidRuntime(199):  at android.app.ActivityThread.access$2100(ActivityThread.java:116) 
05-05 10:36:12.883: ERROR/AndroidRuntime(199):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) 
05-05 10:36:12.883: ERROR/AndroidRuntime(199):  at android.os.Handler.dispatchMessage(Handler.java:99) 
05-05 10:36:12.883: ERROR/AndroidRuntime(199):  at android.os.Looper.loop(Looper.java:123) 
05-05 10:36:12.883: ERROR/AndroidRuntime(199):  at android.app.ActivityThread.main(ActivityThread.java:4203) 
05-05 10:36:12.883: ERROR/AndroidRuntime(199):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-05 10:36:12.883: ERROR/AndroidRuntime(199):  at java.lang.reflect.Method.invoke(Method.java:521) 
05-05 10:36:12.883: ERROR/AndroidRuntime(199):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791) 
05-05 10:36:12.883: ERROR/AndroidRuntime(199):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549) 
05-05 10:36:12.883: ERROR/AndroidRuntime(199):  at dalvik.system.NativeStart.main(Native Method) 

क्या कोई मुझे libmp3lame.so के कार्यों को कॉल करने के लिए सही तरीके से इंगित कर सकता है?

+0

शायद शब्द अंतिम जोड़ने की आवश्यकता है? सार्वजनिक स्थैतिक देशी शून्य get_1lame_1version (char [] buf, int len, अंतिम char [] उपसर्ग); – Pasha

+0

नोप, काम नहीं करता है :( – Goddchen

+0

इसे देखें: http://groups.google.com/group/android-ndk/browse_thread/thread/186678942625f46a/557bfe20de389d24 – Pasha

उत्तर

5

अफसोस की बात है कि आप जावा से किसी भी पुराने सी फ़ंक्शन को कॉल नहीं कर सकते हैं। आपको एक "उलझन" नाम के साथ एक फ़ंक्शन का उपयोग करना होगा या JNI_OnLoad तंत्र का उपयोग करना होगा। किसी भी तरह से, दलविक वीएम फ़ंक्शन कॉल में अतिरिक्त तर्क जोड़ देगा कि नियमित लंग get_version_number फ़ंक्शन की अपेक्षा नहीं है।

यह example of using JNI नाम मैंगलिंग बताता है। अपने जावा वर्ग के लिए, आप इस प्रोटोटाइप के साथ एक समारोह के लिए की आवश्यकता होगी:

void Java_de_goddchen_android_youtubeconverter_LameWrapper_get_11lame_11version 
    (JNIEnv *, jclass, jcharArray, jint, jcharArray); 

JNIEnv और jclass तर्क बुला इंटरफ़ेस का हिस्सा है। यदि आप C++ का उपयोग कर रहे हैं तो extern "C" निर्दिष्ट करना याद रखें। जावा उपकरण आपके लिए सही हेडर फ़ाइल का उत्पादन करेगा।

यदि मैं ऐसा कर रहा था, तो शायद मैं आवश्यक लंगर कॉल के लिए जेएनआई सी रैपर फ़ंक्शन लिखूंगा। इस विशेष मामले में char * का उपयोग लंबाई तर्क के साथ करने के बजाय, और अंतिम तर्क के रूप में खाली char * पास करने के बजाय, मैं एक सरल जावा से सी इंटरफ़ेस तैयार करता हूं जो अभी जावा String लौटाता है। जावा में तो:

package de.goddchen.android.youtubeconverter; 

public class LameWrapper { 
    public static native String getVersion(); 
} 
फिर सी में

है, जो वास्तविक लंगड़ा API कॉल:

JNIEXPORT jstring JNICALL Java_de_goddchen_android_youtubeconverter_LameWrapper_getVersion 
    (JNIEnv * env, jclass c) 
{ 
    char buffer[80]; 
    get_lame_version(buffer, sizeof(buffer) - 1, ""); 
    return (*env)->NewStringUTF(env, buffer)); 
} 

यहां बनाए गए तो जावा/Dalvik पक्ष पर नियंत्रित किया जाता है नया स्ट्रिंग के जीवन चक्र।

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