android - java.lang.UnsatisectedLinkError: dalvik.s systemm.PathClassLoader




c++ swig (11)

আপনি সি ++ কোড সহ মডিউল ব্যবহার করেন এবং একই সমস্যা থাকলে আপনি চেষ্টা করতে পারেন

Build -> Refresh Linked C++ Projects

এছাড়াও, আপনার এই মডিউলটি থেকে কিছু ফাইল খুলতে হবে এবং করা উচিত

Build -> Make module "YourNativeLibModuleName"

কেউ কি এই ত্রুটিটি নিয়ে অভিজ্ঞতা পেয়েছেন?

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/org.swig.simple-2/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "liborg.swig.simple.example.so"

ত্রুটি ঘটে যখন আমি এইভাবে লাইব্রেরি লোড করি।

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

আমি নিশ্চিত যে বর্তমান ফোল্ডারে 'উদাহরণ' শ্রেণি বিদ্যমান।


আমাকে যা সহায়তা করেছিল তা হ'ল বিল্ড.gradle ফাইলে জনি ফাইলগুলির জন্য উত্স ডিরেক্টরিটি নিবন্ধভুক্ত করা। এটি আপনার গ্রেড ফাইলটিতে যুক্ত করুন:

android {
    sourceSets {
        main {
            jniLibs.srcDir '[YOUR_JNI_DIR]' // i.e. 'libs'
        }
    }
}

আমার পক্ষে কাজটি হ'ল jniLibs ফোল্ডারটি "জাভা" এবং "রেস" ফোল্ডারগুলির পাশাপাশি "প্রধান" ফোল্ডারের অধীনে স্থাপন করা , উদাহরণস্বরূপ প্রকল্প -> অ্যাপ্লিকেশন -> এসসিআর -> প্রধান -> jniLibs

আমার কাছে সঠিক নামগুলি সহ সমস্ত গ্রন্থাগার ছিল এবং প্রত্যেকে তাদের নিজ নিজ আর্কিটেকচার সাবফোল্ডারে স্থাপন করেছিল, তবে আমার এখনও একই ব্যতিক্রম ছিল; এমনকি গ্রহণযোগ্য উত্তরের মতো অন্যান্য এসও উত্তরগুলির প্রচুর চেষ্টা করে।। লিবাসের সাথে একটি জেআর সংকলন করে, জনিলিবস ফোল্ডারের অন্যান্য স্থাপনা ইত্যাদি

এই প্রকল্পের জন্য, আমাকে অ্যান্ড্রয়েড স্টুডিও 1.5.1.1 এ গ্রেডল ২.২ এবং অ্যান্ড্রয়েড প্লাগইন ১.১.০ ব্যবহার করতে হয়েছিল


আমি অ্যান্ড্রয়েড স্টুডিও 3.0 ব্যবহার করি এবং এই সমস্যার মুখোমুখি হই। এবং আমি নিশ্চিত যে অ্যাপটির বিল্ড.gradle ঠিক আছে।

রান -> প্রোফাইল কনফিগারেশন -> প্রোফাইলিং এ যান এবং "অ্যাডভান্সড প্রোফাইলিং সক্ষম করুন" অক্ষম করুন।

এটি আমার পক্ষে কাজ করে। রেফারেন্স উত্তর


এটি আমাকে সাহায্য করেছিল। কারও জন্য ভাগ করে নেওয়া যিনি একই সমস্যা নিয়ে আসতে পারেন।

android {
    ....
    defaultConfig {
        ....
        ndk {
            abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
        }
    }
}

এটি আমার জন্য কাজ করা হয়

আপনার যদি আরসোবিতে .so ফাইল রয়েছে তবে কেবলমাত্র সেই ফোল্ডারটিকেই এনডিকে ভিতরে উল্লেখ করুন।

defaultConfig {
        applicationId "com.xxx.yyy"
        minSdkVersion 17
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        renderscriptTargetApi 26
        renderscriptSupportModeEnabled true
        ndk {
            abiFilters "armeabi"
        }
    }

এবং তারপরে এটি ব্যবহার করুন

android.useDeprecatedNdk=true;

গ্রেড.প্রোপার্টি ফাইলগুলিতে


কিছু পুরানো গ্রেড সরঞ্জামগুলি কোনওভাবে বিল্ড ফোল্ডারে .so ফাইলগুলি অনুলিপি করতে পারে না, নীচের মতো এই ফাইলগুলি বিল্ড ফোল্ডারে ম্যানুয়ালি অনুলিপি করে সমস্যার সমাধান করতে পারে:

build/intermediates/rs/{build config}/{support architecture}/

বিল্ড কনফিগারেশন: বিটা / উত্পাদন / সিট / ইউএটি

সমর্থন আর্কিটেকচার: আরমেবি / আরমেবি-ভি 7 এ / মিপস / এক্স 86


তবুও আর একটি ক্র্যাশ কারণ এবং সম্ভাব্য সমাধান এই নিবন্ধে বর্ণিত হয়েছে: https://medium.com/keepsafe-engineering/the-perils-of-loading-native-libraries-on-android-befa49dce2db

সংক্ষেপে:
build.gradle এ

dependencies {
    implementation 'com.getkeepsafe.relinker:relinker:1.2.3'
}

কোডে

static {
    try {
        System.loadLibrary("<your_libs_name>");
    } catch (UnsatisfiedLinkError e) {
        ReLinker.loadLibrary(context, "<your_libs_name>");
    }
}

যদি আপনি অ্যান্ড্রয়েড স্টুডিও ব্যবহার করে থাকেন তবে কেবল মূল ফোল্ডারে গ্রেডল pষধগুলি সম্পাদনা করুন এবং android.useDeprecatedNdk = সত্য যুক্ত করুন। তারপরে আপনার অ্যাপ্লিকেশনটির ফোল্ডারে বিল্ডড্রেডল ফাইলটি সম্পাদনা করুন, নীচের মত অ্যাফিল্টার সেট করুন:

android {
....
defaultConfig {
    ....
    ndk {
        abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
    }
}
}

System.loadLibrary ফোল্ডার থেকে একটি ভাগ করা লাইব্রেরি লোড করে।

"আমি নিশ্চিত 'উদাহরণস্বরূপ' ক্লাসটি বর্তমান ফোল্ডারে উপস্থিত রয়েছে" বলার অর্থ কী? আপনার .so লাইব্রেরিটি ফোল্ডারে ফেলা উচিত।


Simple Solution with Pics

Step1: Add following code in build.gradle file under defaultConfig

     ndk {
            abiFilters "armeabi-v7a", "x86", "armeabi", "mips"
        }
Example:[![enter image description here][1]][1]


Steo 2: Add following code in gradle.properties file

android.useDeprecatedNdk=true

Example: [![enter image description here][2]][2]

Step 3: Sync Gradle and Run the Project.

@Ambilpur


  [1]: https://i.stack.imgur.com/IPw4y.png
  [2]: https://i.stack.imgur.com/ByMoh.png




android-library