سؤال

أريد تحميل مكتبة JNI من طرف ثالث في وقت التشغيل.
لقد حاولت التحميل مباشرة من SDCard. كان من المتوقع أن فشل.
لقد حاولت نسخ المكتبة من SDCARD إلى/بيانات/بيانات/وبعد ذلك
System.load(/data/data/app/libjni.so)
إنه يعمل على HTC Hero ، لكنه يفشل في HTC Legend مع Android 2.1. يفشل أثناء تنفيذ التعليمات البرمجية الأصلية والكتابة لتسجيل تتبع المكدس غير المعني بأي طريقة أخرى للقيام بذلك؟ هذا هو أفضل جزء من الكود ، الذي يعمل في 1.5 (HTC Hero) ، لكن Donot يعمل على 2.1 (HTC Legend).

FileInputStream fis = new FileInputStream("/sdcard/libjni.so");
File nf = new File("/data/data/app/libjni.so");
FileOutputStream fos = new FileOutputStream(nf);
byte[] buf = new byte[2048];
int n;
while ((n = fis.read(buf)) > 0)
    fos.write(buf, 0, n);
fis.close();
fos.close();
System.load("/data/data/app/libjni.so");
هل كانت مفيدة؟

المحلول

لا يمكن لوكيل Android Dynamic Loader تحميل التعليمات البرمجية القابلة للتنفيذ من نظام ملفات SDCARD ، لأنه غير قابل للتنفيذ ولا يمكنك تعيين صفحات الذاكرة القابلة للتنفيذ من التخزين غير القابل للتنفيذ. (من الناحية النظرية ، يمكنك نسخ المحتويات يدويًا إلى صفحات معينة مجهولة للقابلة للتنفيذ ، ولكن هذا قبيح. إصدارات من تطبيقات Android الداعمة على SD Mount أنظمة ملفات قابلة للتنفيذ موجودة داخل ملف على SDCARD ، لكن تطبيق طرف ثالث لا يمكنه كتابة تلك)

ولكن ما يمكنك فعله هو كتابة مكتبة إلى موقع قابل للكتابة فيه داخلي التخزين - ليس دليل lib الذي لا يمكنك الوصول إليه للكتابة ، ولكن هناك مرة أخرى موجودة من context.getDir () أو context.getFilesDir () ثم قم بتحميلها باستخدام المسار الكامل واسم الملف. لذا باستخدام System.Load ( ) بدلا من system.loadlibrary ().

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top