android - ओपनकास्केड एंड्रॉइड स्टूडियो



android-ndk jni (1)

ओपन कैस्केड किसी अनुप्रयोग के निर्माण के लिए कोई भी बायनेरिज़ प्रदान नहीं करता है। अपना खुद का बनाएँ। विंडोज ओएस में एंड्रॉइड के लिए बायनेरिज़ फ़ाइल:

  1. ध्यान से दिए गए चरणों का पालन करें Android के लिए CMake के साथ बिल्डिंग
  2. ओपन कैसकेड इंस्टॉलर के साथ आने वाले केवल Freetype उपयोग करें इस नमूने के लिए FreeImage और अन्य की आवश्यकता नहीं है।
  3. सफल कॉन्फ़िगरेशन और सीमके फाइलों के निर्माण के बाद चरण 1 यूआरएल का पालन करें।
  4. एंड्रॉइड के लिए द्विआधारी फाइलों को बनाने के दौरान कई समस्याएँ आ जाएंगी। नीचे चाल का पालन करें:

    ए। declspec(dllexport) x से संबंधित त्रुटि यह 3 पार्टी लाइब्रेरी फ़्रीटाइप में आता है जो ओसीसी के अंदर freetype-xxx/include/config/ftoption.h । यह त्रुटि में दी गई लाइन संख्या (282 यदि ओसीसी 7.0.0 का उपयोग किया जाता है) को #define FT_EXPORT_DEF(x) x करके और #define FT_EXPORT_DEF(x) x को उसके स्थान पर दर्ज करके इसका समाधान किया जा सकता है

    ख। फिर से निर्माण शुरू करने के लिए मेक कमांड का उपयोग करें

    सी। freetype-xx/lib में freetype-xx/lib । LibEGL.so से ..\android-ndk\platforms\android-xx\arch-arm\usr\lib कॉपी करें और इसे freetype-xx/lib में पेस्ट करें।

    घ। चरण 1 में दिए गए सीमके आउटपुट फ़ोल्डर के लिए ओपन इंक फ़ोल्डर। में सामग्री को कॉपी करें ..\android-ndk\platforms\android-xx\arch-arm\usr\include कदम 4.b का पालन करें

नोट : एंड्रॉइड-एक्सएक्स ANDROID_NATIVE_API_LEVEL पर निर्भर करता है यह एंड्रॉइड -15 हो सकता है

  1. यदि कोई त्रुटियां नहीं हैं, तो चरण 1 यूआरएल का पालन करना जारी रखें।
  2. सफल अधिष्ठापन के बाद, सीमैके आउटपुट डायरेक्टरी पर जाएँ और किसी भी सबफ़ोल्डर्स (लिन 32 / जीसीसी / लिब हो सकता है) में लिब फ़ोल्डर की तलाश करें। लिब फ़ोल्डर के अंदर सभी आवश्यक बाइनरी फाइलें होनी चाहिए।
  3. मैंने बाइनरी बनाई है यहां से डाउनलोड करें और प्रोजेक्ट में jnilibs फ़ोल्डर में बाइनरी कॉपी करें।
  4. फ़्रीटीप के अलावा कोई अन्य तृतीय पक्ष पुस्तकालय की आवश्यकता नहीं है।

अब सवाल पर वापस आ रहे हैं - एक बाहरी बाइनरी के रूप में जोड़ने के लिए gnustl_shared को gnustl_shared नहीं किया गया है

app\build.gradle अंदर app\build.gradle कोड नीचे का उपयोग करें

apply plugin: 'com.android.model.application'

model {
    android {
        compileSdkVersion = 24
        buildToolsVersion = "24.0.2"

        defaultConfig.with {
            applicationId = "com.occ_poc_as"
            minSdkVersion.apiLevel = 21
            targetSdkVersion.apiLevel = 24
            versionCode = 1
            versionName = "1.0"
        }
        buildTypes {
            release {
                minifyEnabled = false
                proguardFiles.add(file('proguard-android.txt'))
            }
        }

        ndk {
            moduleName = "OcctJni_Viewer"
            cppFlags.add("-I${file(getOpenCascadeDir())}".toString())
            cppFlags.add("-frtti")
            cppFlags.add("-fexceptions")
            stl = "gnustl_shared"
            toolchain = 'clang'
            ldLibs.addAll(['android', 'log', 'EGL', 'GLESv2'])
            cppFlags.addAll(['-Wall', '-std=c++11'])
            CFlags.addAll(['-Wall', '-std=c++11'])
        }

        productFlavors {
            // for detailed abiFilter descriptions, refer to "Supported ABIs" @
            // https://developer.android.com/ndk/guides/abis.html#sa
            create("arm7") {
                ndk.with {
                    abiFilters.add("armeabi-v7a")
                    ldFlags.add("-L${file('src/main/jniLibs/armeabi-v7a')}".toString())
                    File curDir = file('./')
                    curDir = file(curDir.absolutePath)
                    String libsDir = curDir.absolutePath + "\\src\\main\\jniLibs\\armeabi-v7a\\"
                    ldLibs.add(libsDir + "libfreetype.so")



                ldLibs.add(libsDir + "libTKBRep.so")
                ldLibs.add(libsDir + "libTKernel.so")
                ldLibs.add(libsDir + "libTKG2d.so")
                ldLibs.add(libsDir + "libTKG3d.so")
                ldLibs.add(libsDir + "libTKGeomAlgo.so")

                ldLibs.add(libsDir + "libTKGeomBase.so")
                ldLibs.add(libsDir + "libTKMath.so")
                ldLibs.add(libsDir + "libTKPrim.so")
                ldLibs.add(libsDir + "libTKTopAlgo.so")
                ldLibs.add(libsDir + "libTKBO.so")

                ldLibs.add(libsDir + "libTKBool.so")
                ldLibs.add(libsDir + "libTKFillet.so")
                ldLibs.add(libsDir + "libTKHLR.so")
                ldLibs.add(libsDir + "libTKIGES.so")
                ldLibs.add(libsDir + "libTKMesh.so")

                ldLibs.add(libsDir + "libTKOffset.so")
                ldLibs.add(libsDir + "libTKOpenGl.so")
                ldLibs.add(libsDir + "libTKService.so")
                ldLibs.add(libsDir + "libTKShHealing.so")
                ldLibs.add(libsDir + "libTKSTEP.so")

                ldLibs.add(libsDir + "libTKSTEP209.so")
                ldLibs.add(libsDir + "libTKSTEPAttr.so")
                ldLibs.add(libsDir + "libTKSTEPBase.so")
                ldLibs.add(libsDir + "libTKV3d.so")
                ldLibs.add(libsDir + "libTKXSBase.so")


                }

            }

        }
    }

}

def getOpenCascadeDir() {
    Properties properties = new Properties()
    properties.load(new File(rootDir.absolutePath + "/local.properties").newDataInputStream())
    def externalModuleDir = properties.getProperty('occ.dir', null)
    if (externalModuleDir == null) {
        throw new GradleException(
                "OpenCascade location not found. Define location with occ.dir in the local.properties file!")
    }
    return externalModuleDir
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar', '.so'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:24.2.0'
}

अंदर local.propertieslocal.properties नीचे स्निपेट्स जोड़ें

sdk.dir=D\:\\Software\\android_sdk
ndk.dir=D\:\\Software\\android-ndk-r12b-windows-x86_64\\android-ndk-r12b
occ.dir=D\:\\Workspace\\OCCT\\inc

OcctJniActivity.java लिए OcctJniActivity.java हटा freeimageTKJniSample को TKJniSample साथ बदलें

     // application code
     || !loadLibVerbose ("OcctJni_Viewer",  aLoaded, aFailed))

नोट :

  1. नमूना के लिए नवीनतम क्राउडेल प्रयोग का प्रयोग करें।

  2. Assest फ़ोल्डर में शेडर जोड़ने के लिए मत भूलना। इस नमूने के लिए दूसरों की आवश्यकता नहीं है

  3. मैंने ओसीसी 7.0.0 और नवीनतम एंड्रॉइड स्टूडियो का उपयोग किया है।

मैं स्रोत कोड और ओसीसी / शामिल फ़ोल्डर संलग्न कर रहा हूँ

मैं नीचे यूआरएल की सहायता से ओपनसीस्कड पर एंड्रॉइड एप्लीकेशन बनाने की कोशिश कर रहा हूं I

http://www.opencascade.com/doc/occt-7.0.0/overview/html/samples_java_android_occt.html

सब कुछ ठीक काम करता है सिवाय मैं नीचे त्रुटियों में फंस गया हूँ:

07-12 17:13:09.711: E/occtJniViewer(16333): Error: native library "gnustl_shared" is unavailable:

07-12 17:13:09.711: E/occtJniViewer(16333):   dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.opencascade.jnisample-2/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "libgnustl_shared.so"

Error: native library "freetype" is unavailable:

07-12 17:13:09.711: E/occtJniViewer(16333):   dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.opencascade.jnisample-2/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "libfreetype.so"

Error: native library "freeimage" is unavailable:

07-12 17:13:09.711: E/occtJniViewer(16333):   dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.opencascade.jnisample-2/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "libfreeimage.so"

Error: native library "TKernel" is unavailable:

07-12 17:13:09.711: E/occtJniViewer(16333):   dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.opencascade.jnisample-2/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "libTKernel.so"

मैं gnustl_shared पुस्तकालय और अन्य .so files को जोड़ने में सक्षम नहीं हूँ कृपया उपरोक्त लिंक के रूप में कदमों का सुझाव दें इनके बारे में अधिक विवरण प्रदान नहीं किया गया है।

कोई मदद महान सहायता का होगी धन्यवाद।





opencascade