2016-07-13 14 views
1

我想在下面的url的幫助下在Opencascade上構建一個Android應用程序。Opencascade Android Studio

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:除了我被困在下面的錯誤

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

,一切工作正常。請建議步驟,因爲上述鏈接沒有提供有關這些的詳細信息。

任何幫助將有很大的幫助。謝謝。

回答

1

OpenCascade不提供用於構建應用程序的任何二進制文件。 構建Android自己的.so文件的二進制文件在Windows OS:

  1. 按照Building with CMake for Android
  2. 只能使用Freetype隨開級聯安裝在這裏仔細給出的步驟。這個樣本不需要其他的FreeImage
  3. 成功配置並生成CMake文件後,請按照步驟1的URL。
  4. 爲Android創建二進制文件時會出現很多問題。按照下面的技巧:

    a。與declspec(dllexport) x相關的錯誤。它來自於freetype-x.x.x/include/config/ftoption.h內的OCC附帶的第三方庫freetype。可以通過註釋錯誤中給出的行號(如果使用OCC 7.0.0,則爲282),並輸入#define FT_EXPORT_DEF(x) x來代替它。

    b。使用make命令重新開始構建。

    c。粘貼freetype.so在freetype-xx/lib。從..\android-ndk\platforms\android-xx\arch-arm\usr\lib複製libEGL.so並將其粘貼到freetype-xx/lib。 d)。打開第1步中給出的CMake輸出文件夾的inc文件夾。複製..\android-ndk\platforms\android-xx\arch-arm\usr\include中的內容並粘貼到inc文件夾中。按照步驟4.b.

注意:Android的XX取決於ANDROID_NATIVE_API_LEVEL。它可以是android-15。

  1. 如果沒有錯誤,請繼續執行步驟1的URL。
  2. 成功安裝後,轉到CMake輸出目錄,並在任何子文件夾(可能是lin32/gcc/lib)中查找lib文件夾。在lib文件夾裏面,所有需要的二進制文件都會在那裏。
  3. 我創建了二進制文件。 download from here並複製項目中jnilibs文件夾中的二進制文件。
  4. 除了freetype,不需要其他第三方庫。

現在回到問題 - gnustl_shared不會被重新添加爲外部二進制文件。

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.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刪除freeimage

  1. 使用最新gradle這個實驗樣品:與

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

    注意更換TKJniSample

  2. 不要忘記在assest文件夾中添加着色器。其他人不需要此示例

  3. 我已經使用OCC 7.0.0和最新的Android Studio。

我附上source codeOCC/include文件夾。