অ্যান্ড্রয়েড স্টুডিও, গ্রেডেল এবং এনডিকে


153

আমি এই পুরো গ্রেড এবং অ্যান্ড্রয়েড স্টুডিও সমর্থন খুব নতুন। আমি রফতানির বিকল্পটি ব্যবহার করে আমার অ্যান্ড্রয়েড প্রকল্পকে গ্রেডে রূপান্তরিত করতে সক্ষম হয়েছি।

তবে আমি কিছু ডকুমেন্টেশন বা স্টার্ট পয়েন্টের সন্ধান করছি যে কীভাবে গ্রেড বিল্ড প্রক্রিয়াতে এনডিকে বিল্ডকে সংহত করতে হয়।

সম্ভব হলে আমার কিছু ধরণের "পরে" পর্যায়ে প্রয়োজন যা বিল্ড বাইনারিগুলি (.so ফাইলগুলি) সম্পদ ডিরেক্টরিতে অনুলিপি করে।


আমি আমার উত্তরটি নীচে উল্লিখিত লিঙ্কটিতে পোস্ট করেছি স্ট্যাকওভারফ্লো.com
আহমদ আলী নাসির

24
নতুন পাঠক: সচেতন হন এই প্রশ্নটি প্রাথমিকভাবে অ্যান্ড্রয়েড স্টুডিও বিটা পিরিয়ডের সময় জিজ্ঞাসা করা হয়েছিল; উত্তর সময়ের সাথে পরিবর্তিত হয়েছে। উত্তরে উল্লিখিত গ্রেডল সংস্করণে মনোযোগ দিন, পাশাপাশি উত্তরগুলি কখন পোস্ট করা হয়েছিল attention
শান বিচ

যদি সত্যিই কিছু পরিবর্তন হয় আমি স্থিতিটি নির্বাচন করতে প্রশ্নটি সম্পাদনা করব
প্লেস্টহস

ক্যানারি চ্যানেলে অ্যান্ড্রয়েড স্টুডিও 1.3 সম্পূর্ণভাবে এনডিকে সমর্থন করে। তথ্যসূত্র: সরঞ্জাম.অ্যান্ড্রয়েড
ডাউনলোড

18 ই জুন, 2015: অ্যান্ড্রয়েড স্টুডিও 1.3 বিটা এখন বিটা চ্যানেলে উপলব্ধ! দুঃখিত, এই বিল্ডটিতে এখনও সি / সি ++ সমর্থন নেই; উত্স: সরঞ্জামস.অ্যান্ড্রয়েড
অ্যান্ড্রয়েডস্টুডিও

উত্তর:


85

আমরা 1.3 তে পূর্বরূপ হিসাবে ইন্টিগ্রেশনটির প্রথম সংস্করণ প্রকাশ করেছি: http://tools.android.com/tech-docs/android-ndk-preview

1.3 চূড়ান্ত হওয়ার পরেও ইন্টিগ্রেশনটি পূর্বরূপ থাকবে। এটি কখন চূড়ান্ত হবে (2015/07/10 হিসাবে) বর্তমান কোনও ইটিএ নেই।

এখানে আরও তথ্য: http://tools.android.com/tech-docs/android-ndk-preview


2
অ্যান্ড্রয়েড স্টুডিও (এবং গ্রেডল সমর্থন)
পাউডার 366

1
@ জিআরএনইভয় - আমরা কীভাবে অ্যান্ড্রয়েড স্টুডিওতে সঠিক এনডিকে নির্মাতা কনফিগার করব? আপনি আমাকে পদক্ষেপ দিতে পারেন? :)
শ্রাবণ

7
@ ডার্টিবিচ কেন এটি পুরানো? স্টুডিওতে এখনও এনডিকে একীকরণ হয়নি। আমরা এটি নিয়ে কাজ করছি তবে বর্তমানে কোনও ইটিএ নেই।
জাভিয়ের ডুক্রোহেট

2
আমার ক্রিয়াটি কীভাবে আমি "সংহতকরণ" সংজ্ঞা দিচ্ছিলাম তার উপর ভিত্তি করে ছিল। আমি বুঝতে পেরেছিলাম যে "গ্রেডের সাথে এনডিকে ব্যবহারের উপায়" যার অর্থ এখন বিদ্যমান, যদিও এর কোনওটিই দুর্দান্ত সমাধান নয়। যাইহোক, আপনার মন্তব্যের ভিত্তিতে, মনে হয় সত্য একটি ইন্টিগ্রেশন কী হতে পারে তার জন্য আপনার দলের মনে কিছু অন্য কিছু রয়েছে। আমি আমার আগের বক্তব্যটি প্রত্যাহার করি।
শান বিচ

2
গুগল আইও ২০১৫ চলাকালীন এনডিকে একীকরণের ঘোষণা দেওয়া হয়েছিল It's এটি অ্যান্ড্রয়েড স্টুডিও ১.৩ এ উপলব্ধ (প্রিভিউ শীঘ্রই ডাউনলোড করা যাবে I'll এটি উপলভ্য হলে আমি একটি লিঙ্ক পোস্ট করব)।
সাইপ্রাস ফ্রাঙ্কেনফিল্ড

43

আপডেট: এনডিকে সহায়তার সাথে অ্যান্ড্রয়েড স্টুডিওটি এখনই শেষ: http://tools.android.com/tech-docs/android-ndk-preview

স্ক্রিপ্ট দিয়ে তৈরি করার জন্য নীচের গ্রেড দ্রবণটি কাজ করা উচিত:

আমি আমার বিল্ড স্ক্রিপ্টটি ব্যবহার করছি এবং আমার ফাইলে যুক্ত করেছি ( 0.8+এটির জন্য কাজ করা লাগে): এটি নীচের সমাধানের সমতুল্য বলে মনে হচ্ছে (তবে গ্রেড ফাইলটিতে আরও সুন্দর দেখাচ্ছে):

 android {
    sourceSets {
        main {
            jniLibs.srcDirs = ['native-libs']
            jni.srcDirs = [] //disable automatic ndk-build
        }
    }
 }

দুর্ভাগ্যক্রমে বিল্ডটি ব্যর্থ হয় না যদি ডিরেক্টরি উপস্থিত না থাকে বা কোনও .soফাইল থাকে না ।


5
এটি নতুন অ্যান্ড্রয়েড স্টুডিও সংস্করণ, ওয়ার্কআরউন্ডের সাথে আর কাজ করে না?
পাউডার366

@ পাউডার366 আমার উত্তর দেখুন।
Leandros

2
একটি খাঁজকাটা জাদু বিট: tasks.withType(com.android.build.gradle.tasks.PackageApplication) { it.jniFolders = [file("libs")] as Set }। সহায়তার জন্য আপনাকে বলছি ধন্যবাদ!
trnl

অ্যান্ড্রয়েড স্টুডিও 0.8.9 এর প্রক্রিয়াটি কী
দীপক

1
@ প্লালিস্টস সঠিক দিকটি নির্দেশ করার জন্য অনেক ধন্যবাদ! গ্রেড স্ক্রিপ্টের দ্বিতীয় লাইনটি jni.srcDirs = [] //disable automatic ndk-buildঅত্যন্ত গুরুত্বপূর্ণ কারণ এটি অ্যান্ড্রয়েড স্টুডিওকে সি / সি ++ উত্স কোডটি পুনর্নির্মাণ থেকে বিরত রাখবে। আপনার পোস্টটি না দেখে এবং এটি আমার সমস্যার সমাধান না করা পর্যন্ত আমি দু'দিন ধরে এটি বের করার চেষ্টা করছি। আমি সত্যিই মনে করি এনডিকে বিল্ড আরও ভালভাবে অ্যান্ড্রয়েড.এম কে কমান্ড লাইন মেকফিল দ্বারা আলাদাভাবে নির্মিত হয়েছে, গ্রেড স্ক্রিপ্ট দ্বারা নয়, যেহেতু সি / সি ++ 40 বছরেরও বেশি সময় ধরে মেকফিল দ্বারা নির্মিত হয়েছে!
টোঙ্গা

40

অ্যান্ড্রয়েড স্টুডিও ১.০ এ আপডেট হওয়ার সাথে সাথে এনডিকে টুলচেন সমর্থনটি প্রচুরভাবে উন্নত হয়েছে ( দ্রষ্টব্য: নতুন পরীক্ষামূলক গ্রেডল প্লাগইন এবং অ্যান্ড্রয়েড স্টুডিও ১.৫ সহ ব্যবহার দেখতে দয়া করে এই পোস্টের নীচে আমার আপডেটগুলি পড়ুন )।

অ্যান্ড্রয়েড স্টুডিও এবং এনডিকে যথেষ্ট সংহত হয়েছে যাতে আপনার মডিউলের বিল্ড.gradle এ আপনাকে কেবল একটি এনডি কে}} ব্লক তৈরি করতে হবে এবং আপনার উত্স ফাইলগুলি (মডিউল) / এসআরসি / প্রধান / জনি ডিরেক্টরিতে সেট করতে হবে - এবং আপনি সম্পন্ন!

কমান্ড লাইন থেকে আর কোনও এনডিকে-বিল্ড নেই।

আমি আমার ব্লগ পোস্টে এটি সম্পর্কে সমস্ত এখানে লিখেছি: http://www.sureshjoshi.com/mobile/android-ndk-in-android-studio-with-swig/

মূল বিষয়গুলি হ'ল:

এখানে দুটি জিনিস আপনার জানা দরকার। ডিফল্টরূপে, যদি আপনার অ্যান্ড্রয়েড অ্যাপ্লিকেশনটিতে লোড হওয়া চাই এমন বাহ্যিক libs থাকে তবে সেগুলি ডিফল্টরূপে (মডিউল) / src / main / jniLibs এ সন্ধান করা হবে। আপনি আপনার মডিউলের বিল্ড.gradle এ SourceSets.main.jniLibs.srcDirs সেট করে এটি পরিবর্তন করতে পারেন। আপনি যে প্রতিটি আর্কিটেকচারকে টার্গেট করছেন তার জন্য আপনার লাইব্রেরি সহ একটি উপ-ডিরেক্টরি প্রয়োজন হবে (যেমন x86, আর্ম, মিপস, আর্ম 64-ভি 8 এ, ইত্যাদি ...)

আপনি যে কোডটি এনডিকে সরঞ্জামচেন দ্বারা ডিফল্টরূপে সংকলন করতে চান তা (মডিউল) / এসসিআর / মেইন / জনিতে অবস্থিত হবে এবং অনুরূপভাবে উপরে, আপনি আপনার মডিউলের বিল্ড.gradle এ উত্সসেটস.মেইন.জিনি.সিআরসিডিআর সেট করে এটি পরিবর্তন করতে পারবেন can

এবং এটি আপনার মডিউলটির বিল্ড।

ndk {
  moduleName "SeePlusPlus" // Name of C++ module (i.e. libSeePlusPlus)
  cFlags "-std=c++11 -fexceptions" // Add provisions to allow C++11 functionality
  stl "gnustl_shared" // Which STL library to use: gnustl or stlport
}

এটি আপনার সি ++ কোডটি সংকলনের প্রক্রিয়া, সেখান থেকে আপনাকে এটি লোড করতে হবে এবং র‌্যাপারগুলি তৈরি করতে হবে - তবে আপনার প্রশ্নটি বিচার করে আপনি ইতিমধ্যে কীভাবে কীভাবে করবেন তা জানেন, তাই আমি পুনরায় হ্যাশ করব না।

এছাড়াও, আমি এখানে উদাহরণের একটি গিথুব রেপো রেখেছি: http://github.com/sureshjoshi/android-ndk-swig-example

আপডেট: 14 জুন, 2015

অ্যান্ড্রয়েড স্টুডিও ১.৩ বের হয়ে গেলে জেটব্রেইনস সিএলআইআন প্লাগইনটির মাধ্যমে সি ++ এর জন্য আরও ভাল সমর্থন থাকা উচিত। আমি বর্তমানে অনুমানের আওতায় আছি যে এটি অ্যান্ড্রয়েড স্টুডিওর মধ্যে থেকে জাভা এবং সি ++ বিকাশের অনুমতি দেবে; তবে আমি মনে করি আমাদের উপরে এখনও উল্লিখিত হিসাবে গ্রেডল এনডিকে বিভাগটি ব্যবহার করা দরকার। অতিরিক্ত হিসাবে, আমি মনে করি জাভা <-> সি ++ র‌্যাপার ফাইলগুলি লেখার এখনও দরকার আছে, যদি না ক্লিওন সেগুলি স্বয়ংক্রিয়ভাবে না করে।

আপডেট: 5 জানুয়ারী, 2016

সর্বশেষ পরীক্ষামূলক গ্রেডল প্লাগইন (0.6.0-alpha3) সহ অ্যান্ড্রয়েড স্টুডিও 1.5 ব্যবহার করতে আমি আমার ব্লগ এবং গিথুব রেপো (বিকাশ শাখায়) আপডেট করেছি।

http://www.sureshjoshi.com/mobile/android-ndk-in-android-studio-with-swig/ http://github.com/sureshjoshi/android-ndk-swig-example

এনডিকে বিভাগের জন্য গ্রেডল বিল্ডটি এখন এর মতো দেখায়:

android.ndk {
    moduleName = "SeePlusPlus" // Name of C++ module (i.e. libSeePlusPlus)
    cppFlags.add("-std=c++11") // Add provisions to allow C++11 functionality
    cppFlags.add("-fexceptions")
    stl = "gnustl_shared" // Which STL library to use: gnustl or stlport
}

এছাড়াও, বেশ আশ্চর্যের সাথে, অ্যান্ড্রয়েড স্টুডিওতে সি ++ - এর জন্য জাভা উত্পাদিত র‌্যাপারগুলি 'নেটিভ' কীওয়ার্ড ব্যবহার করে স্বয়ংক্রিয়ভাবে পূর্ণ হয়েছে:

সি ++ এর স্বয়ংক্রিয়-সম্পূর্ণর উদাহরণ - জাভা রেপার

তবে এটি পুরোপুরি গোলাপী নয় ... আপনি যদি কোডটি অটো-জেনারেট করার জন্য কোনও লাইব্রেরি মোড়ানোর জন্য SWIG ব্যবহার করেন, এবং তারপরে স্থানীয় কীওয়ার্ড অটো-জেনারেশনটি ব্যবহার করার চেষ্টা করেন, এটি কোডটি আপনার সুইগ _র্যাপে ভুল জায়গায় রাখবে .cxx ফাইল ... সুতরাং আপনার এটিকে "বহিরাগত সি" ব্লকে স্থানান্তর করতে হবে:

সি ++ - জাভা র‍্যাপারটি সঠিক জায়গায় সরিয়ে নিয়েছে

আপডেট: 15 অক্টোবর, 2017

আমি স্মরণ করবো যদি আমি উল্লেখ না করি যে অ্যান্ড্রয়েড স্টুডিও ২.২ এর পরে গ্র্যাডল এবং সিএমকেকের মাধ্যমে এনডি কে সরঞ্জামচেনের জন্য মূলত 'নেটিভ' (কোনও পাং) সমর্থন নেই। এখন, আপনি যখন একটি নতুন প্রকল্প তৈরি করবেন, কেবল সি ++ সমর্থন নির্বাচন করুন এবং আপনি যেতে ভাল।

আপনাকে এখনও নিজের জেএনআই লেয়ার কোড তৈরি করতে হবে, বা আমি উপরে উল্লিখিত SWIG কৌশলটি ব্যবহার করতে হবে, তবে অ্যান্ড্রয়েড প্রকল্পে সি ++ এর ভাস্কর্যটি এখন তুচ্ছ।

সিএমকেলিস্ট ফাইলগুলিতে পরিবর্তনগুলি (এটি যেখানে আপনি আপনার সি ++ উত্স ফাইলগুলি রেখেছেন) অ্যান্ড্রয়েড স্টুডিওতে বাছাই করা হবে এবং এটি স্বয়ংক্রিয়ভাবে কোনও সম্পর্কিত লাইব্রেরি পুনরায় সংকলন করবে।


1
(। মডিউল) / এসআরসি / প্রধান / জনিলিবিতে * .so রাখুন
ফোকস

ডিবিগ বিল্ডগুলিতে এমনকি অ্যান্ড্রয়েড স্টুডিও ব্যবহার করার সময় এনডিইবিউজি সর্বদা কেন সেট করা থাকে
pt123

35

গুগল আইও 2015 এ, গুগল অ্যান্ড্রয়েড স্টুডিও 1.3 তে সম্পূর্ণ এনডিকে সংহতকরণ ঘোষণা করেছে।

এটি এখন পূর্বরূপের বাইরে এবং সবার জন্য উপলব্ধ: https://developer.android.com/studio/projects/add-native-code.html

পুরানো উত্তর: আপনার প্রকল্প উত্সে ডিরেক্টরি ndk-buildথাকলে গ্রেডল স্বয়ংক্রিয়ভাবে কল jniকরে।

এটি অ্যান্ড্রয়েড স্টুডিও ০.০.৯ (ক্যানারি বিল্ড) এ কাজ করছে।

  1. এনডিকে ডাউনলোড করুন

  2. হয় ANDROID_NDK_HOMEআপনার পরিবেশের ভেরিয়েবলগুলিতে যুক্ত করুন বা ndk.dir=/path/to/ndkআপনার local.propertiesআপনার Android স্টুডিও প্রকল্পে যুক্ত করুন। এটি অ্যান্ড্রয়েড স্টুডিওগুলিকে স্বয়ংক্রিয়ভাবে এনডিকে চালানোর অনুমতি দেয়।

  3. একটি এনডিকে প্রকল্পের উদাহরণ দেখতে সর্বশেষ গ্রেডের নমুনা প্রকল্পগুলি ডাউনলোড করুন । (তারা পৃষ্ঠার নীচে রয়েছে)। একটি ভাল নমুনা প্রকল্প ndkJniLib

  4. gradle.buildএনডিকে নমুনা প্রকল্পগুলি থেকে অনুলিপি করুন । এটি দেখতে এরকম কিছু দেখাবে। এটি gradle.buildপ্রতিটি আর্কিটেকচারের জন্য আলাদা এপিকে তৈরি করে। build variantsফলকটি ব্যবহার করে আপনি কোন আর্কিটেকচারটি নির্বাচন করতে হবে তা আপনাকে অবশ্যই নির্বাচন করতে হবে । রূপগুলি ফলক তৈরি করুন

    apply plugin: 'android'
    
    dependencies {
        compile project(':lib')
    }
    
    android {
        compileSdkVersion 19
        buildToolsVersion "19.0.2"
    
        // This actual the app version code. Giving ourselves 100,000 values [0, 99999]
        defaultConfig.versionCode = 123
    
        flavorDimensions "api", "abi"
    
        productFlavors {
            gingerbread {
                flavorDimension "api"
                minSdkVersion 10
                versionCode = 1
            }
            icecreamSandwich {
                flavorDimension "api"
                minSdkVersion 14
                versionCode = 2
            }
            x86 {
                flavorDimension "abi"
                ndk {
                    abiFilter "x86"
                }
                // this is the flavor part of the version code.
                // It must be higher than the arm one for devices supporting
                // both, as x86 is preferred.
                versionCode = 3
            }
            arm {
                flavorDimension "abi"
                ndk {
                    abiFilter "armeabi-v7a"
                }
                versionCode = 2
            }
            mips {
                flavorDimension "abi"
                ndk {
                    abiFilter "mips"
                }
                versionCode = 1
            }
            fat {
                flavorDimension "abi"
                // fat binary, lowest version code to be
                // the last option
                versionCode = 0
            }
        }
    
        // make per-variant version code
        applicationVariants.all { variant ->
            // get the version code of each flavor
            def apiVersion = variant.productFlavors.get(0).versionCode
            def abiVersion = variant.productFlavors.get(1).versionCode
    
            // set the composite code
            variant.mergedFlavor.versionCode = apiVersion * 1000000 + abiVersion * 100000 + defaultConfig.versionCode
        }
    
    }

মনে রাখবেন এটি আপনার Android.mk এবং অ্যাপ্লিকেশন.এমকে ফাইলগুলি উপেক্ষা করবে। কার্যকারণ হিসাবে, আপনি গ্রেডকে atuomatic ndk-build কলটি অক্ষম করতে বলতে পারেন, তারপরে ndk উত্সগুলির জন্য ম্যানুয়ালি ডিরেক্টরি নির্দিষ্ট করুন।

sourceSets.main {
    jniLibs.srcDir 'src/main/libs' // use the jni .so compiled from the manual ndk-build command
    jni.srcDirs = [] //disable automatic ndk-build call
}

তদতিরিক্ত, আপনি সম্ভবত আপনার গ্রেড বিল্ড স্ক্রিপ্টে স্পষ্টভাবে এনডিকে-বিল্ড কল করতে চান, কারণ আপনি কেবল স্বয়ংক্রিয় কলটি অক্ষম করেছেন।

task ndkBuild(type: Exec) {
   commandLine 'ndk-build', '-C', file('src/main/jni').absolutePath
}

tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn ndkBuild
}

হ্যাঁ. তবে এটি কেবল ইউনিক্স প্ল্যাটফর্মের অধীনে কাজ করে এবং যদি আপনি খুব সাধারণ এনডিকে কনফিগারেশন / মেকফিলগুলি থেকে আরও জটিল হন তবে সীমাবদ্ধও হয়।
প্লেস্টহোস

হ্যাঁ, এটি সীমিত জিনিসগুলির জন্য মেকফিলগুলি স্বয়ংক্রিয়ভাবে তৈরি করবে যা আপনি গ্রেড বিল্ড ফাইলে সেট করতে পারেন, তবে সেখানে কার্যকারিতা নেই। আমি আমার উত্তরে এটি যুক্ত করেছি।
সাইপ্রাস ফ্রাঙ্কেনফিল্ড

1
এনডিকে-বিল্ডে কলটি কেবল অ্যান্ড্রয়েড স্টুডিওর মধ্যে নয় কমান্ড-লাইনে কাজ করবে।
ক্যামেরন লোয়েল পামার

যদিও এটি সবচেয়ে সাম্প্রতিক উত্তর না হলেও এটি সম্ভবত সবচেয়ে সঠিক বলে মনে হচ্ছে। পদক্ষেপ 3 তে বিশেষ মনোযোগ দিন: " সর্বশেষ গ্রেডের নমুনা প্রকল্পগুলি ডাউনলোড করুন "।
শান সৈকত

4
আমি এসআরসি দির অক্ষম করার পরিবর্তে এই হ্যাকটি ব্যবহার করি যাতে আমি সি / সি ++ ফাইলগুলি tasks.all { task -> if (task.name.contains('Ndk')) task.enabled = false }
আদর্শের

23

আমি "গ্রেড 1.11 কম.অ্যান্ড্রয়েড.টুলস.বিল্ড:গ্র্যাডেল.কি..9.+ পেয়েছি .+" এখন প্রাক-বিল্ড এনডিকে সমর্থন করে, আপনি সবেমাত্র * .so dir src / main / jniLibs এ রাখতে পারেন। গ্রেডল তৈরি করার সময় এনডিকে সঠিক জায়গায় প্যাকেজ করবে।

এখানে আমার প্রকল্প

প্রকল্প:
| --src
| - | --main
| - | - | --java
| - | - | --jniLibs
| - | - | - | --armeabi
| - | - | - | - | -। তাই ফাইল
| --libs
| - | --other.jar

18

জাভিয়ার যেমন বলেছে, আপনি যদি নিজের গ্রেড 0.7.2+ ব্যবহার করেন তবে / src / main / jniLibs / এ আপনার প্রি-বিল্টগুলি রাখতে পারেন

থেকে নেওয়া হয়েছে: https://groups.google.com/d/msg/adt-dev/nQobKd2Gl_8/ctDp9viWaxoJ


আমরা কীভাবে নমুনা 0.7.2 এনডিকে জনিলিবে দেখতে পারি?
রায়ান হিটনার

স্কেলসিফার
personne3000

16

এখনকার হিসাবে (অ্যান্ড্রয়েড স্টুডিও v0.8.6) এটি বেশ সহজ। "হ্যালো ওয়ার্ল্ড" টাইপ অ্যাপ্লিকেশন তৈরি করার পদক্ষেপগুলি এখানে রয়েছে:

  1. অ্যান্ড্রয়েড এনডিকে ডাউনলোড করুন এবং মূল ফোল্ডারটি কোথাও বুদ্ধিমানভাবে রেখে দিন - সম্ভবত এসডিকে ফোল্ডার হিসাবে একই স্থানে।

  2. আপনার local.propertiesফাইলে নিম্নলিখিতগুলি যুক্ত করুন: ndk.dir=<path-to-ndk>

  3. লাইনের defaultConfigঠিক পরে, বন্ধের অভ্যন্তরে আপনার বিল্ড.gradle ফাইলটিতে নিম্নলিখিতগুলি যুক্ত করুন versionName:ndk { moduleName="hello-world" }

  4. আপনার অ্যাপ্লিকেশন মডিউলটির mainডিরেক্টরিতে, নতুন একটি ফোল্ডার তৈরি করুন jni

  5. এই ফোল্ডারে, নামক একটি ফাইল তৈরি করুন hello-world.c, যা আপনি নীচে দেখতে পাবেন।

  6. Activityকীভাবে কোনও পদ্ধতিতে কল করতে হয় তার উদাহরণের জন্য নীচের উদাহরণ কোডটি দেখুন (বা এটি কোনও ফাংশন?) hello-world.c


hello-world.c

#include <string.h>
#include <jni.h>

jstring
Java_me_mattlogan_ndktest_MainActivity_stringFromJNI(JNIEnv* env, jobject thiz)
{
    return (*env)->NewStringUTF(env, "Hello world!");
}

MainActivity.java

public class MainActivity extends Activity {

    static {
        System.loadLibrary("hello-world");
    }

    public native String stringFromJNI();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String testString = stringFromJNI();

        TextView mainText = (TextView) findViewById(R.id.main_text);
        mainText.setText(testString);
    }
}

build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 20
    buildToolsVersion "20.0.0"

    defaultConfig {
        applicationId "me.mattlogan.ndktest"
        minSdkVersion 15
        targetSdkVersion 20
        versionCode 1
        versionName "1.0"

        ndk {
            moduleName "hello-world"
        }
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

এখানে একটি খুব অনুরূপ অ্যাপ্লিকেশনটির সম্পূর্ণ উত্স কোডটি সন্ধান করুন (মাইনাস এনডিকে)।


আমি আমার বর্তমান প্রকল্পে যেমন নির্দেশনা দিয়েছিলাম ঠিক তেমন করছি তবে এনডিকে স্টাফ এখনও তৈরি হচ্ছে না। কোন ধারনা? দেখে মনে হচ্ছে এটি অন্য সবকিছু তৈরি করছে, তবে কেবল জেনি স্টিপগুলি এড়িয়ে চলেছে।
অ্যালিস.হারিসন

@ নান্নুওলি ধন্যবাদ, আমি চেষ্টা করেছিলাম কিন্তু যেখানে এমন সমস্যা তৈরি হচ্ছে সেখানে আমি একটি সমস্যা পাচ্ছি। অন্য সব কিছুই কাজ করে মনে হচ্ছে, তবে আমি যখন এমুলেটরে এপিজিজি চালাই, তখন এটি অভিযোগ করে যে এটি ভাগ করা বস্তুটি লোড করতে পারে না।
aaa90210

@ aaa90210 আপনার ইমুলেটরটি কোনও x86 চিত্রের উপর ভিত্তি করে? ডিফল্টরূপে এনডি কে কেবল একটি আরএমইএবিআই লাইব্রেরি তৈরি করবে, আপনি যদি একটি x86 চিত্র তৈরি করতে চান তবে আপনি এই লাইনটি অ্যাপ্লিকেশনটিতে যুক্ত করতে পারেন: অ্যাপ_এবিআই: = আরমেবি x86
লিও মনিকা

1
এটা আমার সাথে কাজ করেছে। পিএস: যে কেউ এই উত্তরটি দেখছেন, Java_me_mattlogan_ndktest_MainActivity_stringFromJNIআপনার নিজের থেকে পরিবর্তন করতে ভুলবেন না :)
আব্দুলমোমেন عبدالمؤمن

8

আপনি যদি ইউনিক্সে থাকেন তবে সর্বশেষতম সংস্করণ (0.8) ndk-build যোগ করে। এটি কীভাবে যুক্ত করবেন তা এখানে:

android.ndk {
    moduleName "libraw"
}

এটি 'src / main / jni' এর অধীনে জেএনআই খুঁজে পাওয়ার প্রত্যাশা করে, অন্যথায় আপনি এটি সংজ্ঞায়িত করতে পারেন:

sourceSets.main {
    jni.srcDirs = 'path'
}

২৮ জানুয়ারী ২০১৪ সংস্করণে 0.8 বিল্ডটি উইন্ডোতে ভেঙে গেছে, আপনাকে বিল্ডটি এটি দিয়ে অক্ষম করতে হবে:

sourceSets.main {
    jni.srcDirs = [] //disable automatic ndk-build call (currently broken for windows)
}

1
সেই বৈশিষ্ট্যে কোনও ডকুমেন্টেশন আছে কি? আমি কিছুই খুঁজে পেলাম না। এই মুহুর্তে আমার অ্যান্ড্রয়েড.এমকে / অ্যাপ্লিকেশন.এমকে পুরোপুরি উপেক্ষা করা হবে বলে মনে হচ্ছে।
প্লেস্টহস

আমি কিছুই পাই না। এটি অর্ধ-বেকড বিল্ড মধ্যে snuck হতে পারে। আমি উইন্ডোতে রয়েছি তাই আমি কেবল এটিই নিশ্চিত করতে পারি যে এটি ইউনিক্সকে এনডিকে-বিল্ড স্ক্রিপ্ট কল করার চেষ্টা করতে ব্যর্থ হয়েছে। গ্রেডে নেটিভ সংকলনকে সংহত করার জন্য এটিকে কল করার আর কোনও কারণ নেই। আপনি কি ইউনিক্সে আছেন?
অ্যান্টনি


এটি jniLibs.srcDirs
আলপাইন

আমি এনডিকে-বিল্ড কল করার ক্র্যাশ হয়ে গেছে এর ভিত্তিতে আমি একমত নই যা বিল্ট গ্রন্থাগারগুলির প্রয়োজন হলে একেবারে প্রয়োজনীয় নয়। আমার কাছে এখনই ভিএমএক্স ভিএম করার সময় নেই বলে আমি নিশ্চিত করতে পারি না।
অ্যান্টনি

7

একটি মার্জিত কাজটি https://groups.google.com/d/msg/adt-dev/nQobKd2Gl_8/Z5yWAvCh4h4J এ দেখানো হয়েছে ।

মূলত আপনি একটি জার তৈরি করেন যার মধ্যে "lib / armeabi / yourlib.so" থাকে এবং তারপরে জারটি অন্তর্ভুক্ত করে।


হ্যাঁ। আপনি কেবলমাত্র নিজের কোড নেটিভটি প্রায়শই পরিবর্তন না করলে এটি কেবল ভাল কাজ করে। এবং আপনাকে সংগ্রহস্থলে বাইনারি জারের ফাইলগুলি অন্তর্ভুক্ত করতে হবে। অন্যথায় আপনি বিল্ড স্ক্রিপ্ট দিয়ে শেষ করেন যা ফ্লাইতে জার তৈরি করে।
প্লেস্টহোস

1
আমি অ্যান্ড্রয়েডের হ্যালো-জেএনআই উদাহরণটি একটি সরল বাশ স্ক্রিপ্টের সাহায্যে সংশোধন করেছি যা প্রতিটিটির জন্য মোড়ক করে ndk-build, জেনারেট .jarকরে .soএবং এ ব্যথা লাঘব করার জন্য গ্রেডের তৈরির পথে রাখে। এটা দেখ.
dbro

4

সহজেই সংকলিত- .soফাইলগুলির প্যাকেজিং স্বয়ংক্রিয় করার একটি ভাল উত্তর অন্য (বন্ধ) থ্রেডে দেওয়া হয়েছে । এই কাজটি পেতে, আমাকে লাইনটি পরিবর্তন করতে হয়েছিল:

from fileTree(dir: 'libs', include: '**/*.so')

মধ্যে:

from fileTree(dir: 'src/main/libs', include: '**/*.so') 

এই পরিবর্তন ব্যতীত .soফাইলগুলি পাওয়া যায় নি, এবং সেগুলির প্যাকেজিংয়ের কাজটি কখনই চলবে না।


আপডেট: দয়া করে নোট করুন যে নতুন অ্যান্ড্রয়েড স্টুডিওগুলিতে (কমপক্ষে 1.5 তে) দেশীয় কোডটি আরও ভালভাবে অন্তর্ভুক্ত করা হয়েছে এবং আপনার কোডটি প্যাকেজিংয়ের জন্য এই পৃথক টাস্কটি করা প্রয়োজন হয় না।
এইচইইএস

4

@ প্লালিস্টোসের উত্তর সর্বশেষতম গ্রেড সংস্করণে ভেঙে গেছে তবে এটি করার এখনও একটি উপায় রয়েছে। native-libsআপনার প্রকল্প ডিরেক্টরিটির মূলের মধ্যে একটি ডিরেক্টরি তৈরি করুন এবং আমাদের ডিরেক্টরিতে সমস্ত y অনন্য এই ডিরেক্টরিতে অনুলিপি করুন।

আপনার বিল্ড.gradle এ নিম্নলিখিত লাইনগুলি যুক্ত করুন। বিল্ড এবং সুখী।

task copyNativeLibs(type: Copy) {
    from(new File(project(':<your project>').getProjectDir(), 'native-libs')) { include '**/*.so' }
    into new File(buildDir, 'native-libs')
}

tasks.withType(Compile) { compileTask -> compileTask.dependsOn copyNativeLibs }

clean.dependsOn 'cleanCopyNativeLibs'

3

গ্রেড থেকে অ্যান্ড্রয়েড-এনডিকে ব্যবহার করে আমি এটি তৈরি করতে কোডটি ব্যবহার করি। এই জন্য এনডিকে ডিরেক্টরি পাথ যুক্ত করুন gradle.properties। যোগ ndkdir=/home/user/android-ndk-r9dএবং একটি ফোল্ডারে সব jni ফাইল করা nativeমধ্যে src/main/আপনি দেখতে পারেন হিসাবে কোড থেকে নীচের পোস্ট করা হয়েছে। এটি দেশীয় libs দিয়ে জার তৈরি করবে যা আপনি সাধারণত হিসাবে ব্যবহার করতে পারেনSystem.loadLibrary("libraryname");

dependencies {
    compile fileTree(dir: "$buildDir/native-libs", include: '*.jar')
}

task ndkBuild(type: Exec) {
    commandLine "$ndkdir/ndk-build", "--directory", "$projectDir/src/main/native", '-j', Runtime.runtime.availableProcessors(),
            "APP_PLATFORM=android-8",
            "APP_BUILD_SCRIPT=$projectDir/src/main/native/Android.mk",
            "NDK_OUT=$buildDir/native/obj",
            "NDK_APP_DST_DIR=$buildDir/native/libs/\$(TARGET_ARCH_ABI)"
}

task nativeLibsToJar(type: Jar, description: 'create a jar with native libs') {
    destinationDir file("$buildDir/native-libs")
    baseName 'native-libs'
    from fileTree(dir: "$buildDir/native/libs", include: '**/*.so')
    into 'lib/'
}

tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn nativeLibsToJar
}

nativeLibsToJar.dependsOn 'ndkBuild'

3

নেটিভ ড্রপবক্স লাইব্রেরিগুলি সংকলন করতে আমি নিম্নলিখিত কোডগুলি ব্যবহার করেছি, আমি অ্যান্ড্রয়েড স্টুডিও ভি 1.1 ব্যবহার করছি।

task nativeLibsToJar(type: Zip) {
    destinationDir file("$buildDir/native-libs")
    baseName 'native-libs'
    extension 'jar'
    from fileTree(dir: 'src/main/libs', include: '**/*.so')
    into 'lib/'
}

tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn(nativeLibsToJar)
}

2

আমি ব্যবহার করেছি ndk.dir=/usr/shareData/android-ndk-r11b // NDK পথ

মধ্যে local.properties অ্যান্ড্রয়েড স্টুডিও প্রকল্পে ফাইল। : এবং এই লাইন যোগ
android.useDeprecatedNdk=true

মধ্যে gradle.properties অ্যান্ড্রয়েড স্টুডিও প্রকল্পে ফাইল।

এখানে আরও তথ্য: http://tools.android.com/tech-docs/android-ndk-preview


1

নেক্সোস যা বলেছিলেন তার বিস্তৃত করার জন্য (আমাকে সঠিক দিকে পাঠানোর জন্য ধন্যবাদ নকসোস!), আমি সম্প্রতি প্রকাশিত এনডিকে উদাহরণ থেকে বেশ কিছুটা শিখেছি এবং এখানে একটি অনুরূপ প্রশ্নের উত্তর পোস্ট করেছি।

অ্যান্ড্রয়েড গ্রেডল প্লাগইন 0.7 দিয়ে এনডিকে কীভাবে কনফিগার করবেন

বিভিন্ন আর্কিটেকচারের জন্য প্রিল বিল্ট নেটিভ লাইব্রেরিগুলি আপনার অ্যাপ্লিকেশনে লিঙ্ক করার পাশাপাশি বিল্ড.gradle স্ক্রিপ্টে কীভাবে সরাসরি এনডিকে সহায়তা যুক্ত করতে হয় তার তথ্য এই পোস্টে রয়েছে। বেশিরভাগ ক্ষেত্রে, আপনাকে জিপ এবং অনুলিপিটির চারপাশে কাজ করার দরকার নেই।


1

আমার অ্যান্ড্রয়েড স্টুডিও প্রকল্পে এনডিকে কাজ করতে আমি যে পদক্ষেপগুলি ব্যবহার করেছি তা এখানে। আমি এই টিউটোরিয়ালটি আমাকে https://software.intel.com/en-us/videos/using-the-ndk-with-android-studio- র সাহায্যে সহায়তা করতে ব্যবহার করেছি

এনডিকে ব্যবহার করার জন্য আপনাকে অবশ্যই স্থানীয়.প্রপার্টিগুলিতে একটি এনডিকে লাইন যুক্ত করতে হবে। সুতরাং আপনার sdk.dir অধীনে অ্যাড

ndk.dir=C\:\\MyPathToMyNDK\ndk

আমার অ্যাপ্লিকেশন build.gradle এ আমার কাছে নিম্নলিখিত কোড রয়েছে

        ndk {
            moduleName "myLib"
            ldLibs "log"
            stl "gnustl_shared"
            cFlags "-std=c++11 -frtti -fexceptions -pthread"
        }

মডিউলনাম হল সেই নাম যা আপনি আপনার স্থানীয় কোডটি দিতে চান। আমি বিশ্বাস করি এটিই ভাগ করা লাইব্রেরি বলা হবে। ldLibs আমাকে লগগিকেটে লগইন করতে দেয়, আপনি যে আমদানি করতে চান সেই স্টাইলই এই স্টাইল। অনেকগুলি বিকল্প রয়েছে, যা একটিগ্রাহ এনডিকে-র মতো। ( http://www.kandroid.org/ndk/docs/CPLUSPLUS-SUPPORT.html )

cFlags এখনও আমার কাছে নির্দিষ্ট পরিমাণে কালো যাদু। সমস্ত বিকল্প এবং তারা আমাকে যা দেয় তার জন্য আমি কোনও ভাল উত্স খুঁজে পাইনি। আপনার প্রয়োজনীয় যে কোনও কিছুর জন্য স্ট্যাকওভারফ্লো এর চারপাশে অনুসন্ধান করুন, এটিই আমি এটি পেয়েছি। আমি জানি যে সি ++ 11 আমাকে নতুন সি ++ 11 মান ব্যবহার করতে দেয় use

আমি কীভাবে স্থানীয় কোড থেকে লগগিতে লগইন করি তার একটি উদাহরণ এখানে

__android_log_print(ANDROID_LOG_DEBUG, "TestApp", "Adding - String %d has a field name of %s and a value of %s", i, lKeyUTF8.c_str(), lValueUTF8.c_str());

1

অ্যাল্রয়েড থেকে অ্যান্ড্রয়েড স্টুডিওতে প্রকল্পটি কনফিগার করুন : আপনাকে গ্রেডে এনডিকে প্রজেক্টটি গ্রেডে রফতানি না করেই অ্যান্ড্রয়েড স্টুডিওতে আমদানি করতে হবে এবং এটি কাজ করে, এছাড়াও আপনাকে স্থানীয়.properties- এ এনডিকে পথ যোগ করতে হবে , যদি ত্রুটি দেখায় তবে যুক্ত করুন

sourceSets.main {
        jniLibs.srcDir 'src/main/libs' 
        jni.srcDirs = [] //disable automatic ndk-build callenter code here
    }

build.gradle ফাইলের মধ্যে টার্মিনাল ব্যবহার করে jni ফোল্ডার এবং ফাইল তৈরি করুন এবং এটি কাজ করবে run


1
আমার নিজের উত্তর দেখুন দেখুন। এটি হ'ল আমি বর্তমানে ব্যবহার করছি তবে এটি কোনও সমাধান নয়।
প্লাস্টোস

1

অ্যান্ড্রয়েড স্টুডিওটি এখন স্থিতিশীল চ্যানেলে থাকা, অ্যান্ড্রয়েড-এনডিকে নমুনাগুলি চালানো বেশ সহজবোধ্য । এই নমুনাগুলি এনডিকে পরীক্ষামূলক প্লাগইন ব্যবহার করে এবং অ্যান্ড্রয়েড এনডিকে অনলাইন ডকুমেন্টেশন থেকে লিঙ্কযুক্তগুলির চেয়ে নতুন। একবার আপনি তাদের কাজ জানতে পারলে আপনি বিল্ড.gradle, স্থানীয়.properties এবং গ্রেড- wrapper.properties ফাইল অধ্যয়ন করতে পারেন এবং সেই অনুযায়ী আপনার প্রকল্পটি পরিবর্তন করতে পারেন। তাদের কাজ করার জন্য নিম্নলিখিত পদক্ষেপগুলি নীচে দেওয়া হয়েছে।

  1. সেটিংস, উপস্থিতি এবং আচরণ, সিস্টেম সেটিংস, অ্যান্ড্রয়েড এসডিকে, এসডিকে সরঞ্জাম ট্যাব নির্বাচন করে এবং তালিকার নীচে অ্যান্ড্রয়েড এনডিকে সংস্করণ 1.0.0 দেখুন। এটি এনডিকে ডাউনলোড করবে।

  2. সদ্য ডাউনলোড হওয়া এনডিকে-র অবস্থান নির্দেশ করুন। নোট করুন যে এটি sdk / ndk- বান্ডেল ডিরেক্টরিতে স্থাপন করা হবে। ফাইল, প্রকল্পের কাঠামো, এসডিকে অবস্থান (বাম দিকে) নির্বাচন করে এবং অ্যান্ড্রয়েড এনডিকে অবস্থানের অধীনে কোনও পথ সরবরাহ করে এটি করুন। এটি এর অনুরূপ লোকাল.প্রপ্রেটিগুলিতে একটি এনডিকি এন্ট্রি যুক্ত করবে:

    ম্যাক / লিনাক্স: ndk.dir = / Android / sdk / ndk-bundle
    উইন্ডোজ: ndk.dir = সি: \ অ্যান্ড্রয়েড \ sdk \ ndk- বান্ডিল

আমি gles3gni, নেটিভ-কোডেক এবং নির্মাতা ব্যতীত সফলভাবে সমস্ত প্রকল্পগুলি সংগ্রহস্থলটিতে তৈরি এবং স্থাপন করেছি। আমি নিম্নলিখিত ব্যবহার করছি:

অ্যান্ড্রয়েড স্টুডিও 1.3 বিল্ড এআই-141.2117773
অ্যান্ড্রয়েড-NDK প্রকাশিত জুলাই 28 নমুনা, 2015 (উপরে লিঙ্ক)
SDK এর সরঞ্জামসমূহ 24.3.3
NDK r10e সি নিষ্কাশিত: \ অ্যান্ড্রয়েড \ SDK \ NDK-বান্ডিল
Gradle 2.5
Gradle প্লাগইন 0.2.0
উইন্ডোজ 8.1 64 বিট


1

NDK বিল্ডস এবং গ্রেড (বেসিক)

সাধারণত এনডিকে দিয়ে বিল্ডিং ঠিক ততই সহজ যা সঠিকভাবে অ্যান্ড্রয়েড.এমকে বা এনডিকে বিল্ডস.টিএসটিএমে সিএমকে পাথের জন্য একটি এনডি কে বিল্ড পাথ নির্দিষ্ট করে দেয়। আমি পুরানো অ্যান্ড্রয়েড.এমকে দিয়ে সিএমকে প্রস্তাব দিচ্ছি কারণ অ্যান্ড্রয়েড স্টুডিওর সি / সি ++ সমর্থনটি ক্লিওনের উপর ভিত্তি করে এবং এটি সিএমকে এর প্রকল্প বিন্যাস হিসাবে ব্যবহার করে। এটি আমার অভিজ্ঞতাতে আইডিইকে বৃহত্তর প্রকল্পগুলিতে আরও প্রতিক্রিয়াশীল করার প্রবণতা দেখিয়েছে। আপনার প্রকল্পে সংকলিত সমস্ত কিছুই স্বয়ংক্রিয়ভাবে APK এ তৈরি করা হবে এবং অনুলিপি করা হবে।

apply plugin: 'com.android.library'

android {
    compileSdkVersion 19
    buildToolsVersion "25.0.2"

    defaultConfig {
        minSdkVersion 19
        targetSdkVersion 19

        ndk {
            abiFilters 'armeabi', 'armeabi-v7a', 'x86'
            // 64-bit support requires an Android API level higher than 19; Namely 21 and higher
            //abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
        }

        externalNativeBuild {
            cmake {
                arguments '-DANDROID_TOOLCHAIN=clang',
                        '-DANDROID_PLATFORM=android-19',
                        '-DANDROID_STL=gnustl_static',
                        '-DANDROID_ARM_NEON=TRUE'

            }
        }
    }

    externalNativeBuild {
        cmake {
            path 'src/main/jni/CMakeLists.txt'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

প্রকল্পে প্রাক বিল্ট লাইব্রেরি যুক্ত করা হচ্ছে (উন্নত)

আপনার এনডি কে বিল্ডে স্থির লাইব্রেরি (.a) স্বয়ংক্রিয়ভাবে অন্তর্ভুক্ত হবে তবে প্রি-বিল্ট ডায়নামিক লাইব্রেরি (.so) স্থাপন করা দরকার jniLibs। এটি ব্যবহার করে কনফিগার করা যায় sourceSetsতবে আপনার মানটি অবলম্বন করা উচিত। build.gradleপ্রাক বিল্ট লাইব্রেরি সহ যখন আপনাকে কোনও অতিরিক্ত কমান্ডের প্রয়োজন হয় না ।

এর বিন্যাস jniLibs

আপনি অ্যান্ড্রয়েড গ্র্যাডল প্লাগইন ব্যবহারকারী গাইডে কাঠামো সম্পর্কে আরও তথ্য পেতে পারেন ।

|--app:
|--|--build.gradle
|--|--src:
|--|--|--main
|--|--|--|--java
|--|--|--|--jni
|--|--|--|--|--CMakeLists.txt
|--|--|--|--jniLibs
|--|--|--|--|--armeabi
|--|--|--|--|--|--.so Files
|--|--|--|--|--armeabi-v7a
|--|--|--|--|--|--.so Files
|--|--|--|--|--x86
|--|--|--|--|--|--.so Files

তারপরে আপনি ফলিত এপিএকে বিষয়বস্তুগুলি তালিকাভুক্ত build/outputs/apk/করে সাধারণত আপনার নীচে থাকা .so ফাইলগুলি যাচাই করতে পারেন unzip -l myApp.apk

ভাগ করা লাইব্রেরি নির্মাণ

আপনি যদি এনডিকে একটি ভাগ করা লাইব্রেরি তৈরি করে থাকেন তবে আপনাকে আরও কিছু করার দরকার নেই। এটি APK এ সঠিকভাবে বান্ডিল হবে।


0

অ্যাপটিতে এই লাইনগুলি কেবল যুক্ত করুন build.gradle

dependencies {
    ...
    compile fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')
}

task nativeLibsToJar(type: Zip, description: 'create a jar archive of the native libs') {
    destinationDir file("$buildDir/native-libs")
    baseName 'native-libs'
    extension 'jar'
    from fileTree(dir: 'libs', include: '**/*.so')
    into 'lib/armeabi/'
}

tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn(nativeLibsToJar)
}

আমি মনে করি jniLibs.srcDirs এর পদ্ধতির তুলনায় আরও পরিষ্কার কারণ আপনি abiFilter / স্বাদ ব্যবহার করতে পারেন তবে আপনার পদ্ধতিরও কাজ করা উচিত।
প্লেস্টহোস

0

now.I তাই সাফল্য লোড করতে পারেন!

.SO ফাইলটিকে এই পথে যুক্ত করুন

Project:

| --src | - | - মেইন | - | - | - জাভা | - | - | --jniLibs | - | - | - | --আরমিবি | - | - | - | - | -। তাই ফাইল

এই কোডটি গ্রেড.বিল্ডে যোগ করুন

android {
splits {
    abi {
        enable true
        reset()
        include 'x86', 'x86_64', 'arm64-v8a', 'armeabi-v7a', 'armeabi'
        universalApk false
    }
}

}

3।System.loadLibrary("yousoname");

  1. গুডলাক আপনার জন্য, এটি গ্রেড 1.2.3.3 সহ ঠিক আছে

0
  1. যদি আপনার প্রকল্পটি গ্রহন থেকে রফতানি করা হয় তবে গ্রেড ফাইলটিতে নীচের কোডগুলি যুক্ত করুন :

    android {
       sourceSets{
            main{
               jniLibs.srcDir['libs']  
          }  
        }
    }

2. যদি আপনি অ্যান্ড্রয়েড স্টুডিওতে কোনও প্রকল্প তৈরি করেন:

src / main / in এ jniLibs নামে একটি ফোল্ডার তৈরি করুন এবং আপনার * .so ফাইলগুলি jniLibs ফোল্ডারে রাখুন।

এবং আপনার গ্রেড ফাইলের নীচে হিসাবে কোড অনুলিপি করুন :

android {
    sourceSets{  
       main{  
         jniLibs.srcDir['jniLibs']  
      }  
    }
}

0

যদিও আমি বিশ্বাস করি যে এস জোশি (ওরাকল লোক) এর সর্বাধিক সম্পূর্ণ উত্তর রয়েছে, এসডাব্লুআইজি প্রকল্পটি একটি বিশেষ কেস, আকর্ষণীয় এবং দরকারী একটি, তবে বেশিরভাগ প্রকল্পের জন্য যা সাধারণ এসডিকে পিঁপড়া ভিত্তিক প্রকল্পগুলির সাথে ভাল করেছে + NDK। আমরা সবাই এখনই সম্ভবত অ্যান্ড্রয়েড স্টুডিওটি ব্যবহার করতে চাই বা মোবাইলের জন্য আরও একটি সিআই বান্ধব বিল্ড টুলচেন চাই যা তাত্ত্বিকভাবে তাত্ত্বিকভাবে অফার করে।

আমি আমার পদ্ধতির পোস্ট করেছি, কোথাও থেকে edণ নিয়েছি (এটি এসও-তে পেয়েছি, তবে বিল্ড . gradle অ্যাপ্লিকেশনটির জন্য একটি সূচক পোস্ট করেছি: https://gist.github.com/truedat101/c45ff2b69e91d5c8e9c7962d4b96e841 ) 1 সংক্ষেপে, আমি নিম্নলিখিতগুলি সুপারিশ করছি:

  • আপনার প্রকল্পটি সর্বশেষ গ্রেড বিল্ডে আপগ্রেড করবেন না
  • আপনার প্রকল্পের মূলটিতে com.android.tools.build:gradleuthor.5.5.0 ব্যবহার করুন
  • আপনার অ্যাপ্লিকেশন প্রকল্পে com.android.application ব্যবহার করুন
  • গ্রেড.প্রোপার্টি রয়েছে তা নিশ্চিত করুন: android.useDeprecatedNdk = সত্য (এটি অভিযোগ করার ক্ষেত্রে)
  • Android.mk ফাইলগুলি তৈরি করার সময় এবং ঘন্টা চেষ্টা করার চেষ্টা করার জন্য উপরের পদ্ধতির ব্যবহার করুন। কোনটি সংরক্ষণাগার (গুলি) তৈরি করতে হবে তা আপনি নিয়ন্ত্রণ করেন। এবং এই নির্দেশাবলী উইন্ডোজ ব্যবহারকারীদের প্রতি করুণাময়, যাদের তাত্ত্বিকভাবে বিশেষ সমস্যা ছাড়াই উইন্ডোতে তৈরি করতে সক্ষম হওয়া উচিত।

অ্যান্ড্রয়েডের জন্য গ্রেডল আমার মতে একটি জগাখিচুড়ি হয়েছে, যতটা আমি orrowণ নেওয়া মাভেন ধারণা এবং কোনও প্রকল্পের জন্য ডিরেক্টরিগুলির মতামত কাঠামো পছন্দ করি। এই এনডিকে বৈশিষ্ট্যটি প্রায় 3+ বছর ধরে "শীঘ্রই" আসছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.