Issue
I am trying to build an Android application on Opencascade with the help of below url.
http://www.opencascade.com/doc/occt-7.0.0/overview/html/samples_java_android_occt.html
Everything works fine except I am stuck in below errors :
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"
I am not able to add gnustl_shared
library and other .so files
. Please suggest steps as the above link does not provide much detail about these.
Any help will be of great assistance. Thanks.
Solution
OpenCascade does not provide any binaries for building an application. Build your own .so binaries file for Android in Windows OS :
- Follow the steps carefully given here Building with CMake for Android
- Use only
Freetype
that comes with Open Cascade installer.FreeImage
and others are not required for this sample. - After successful configuration and generation of CMake files, follow the step 1 URL.
There will be lots of issues while creating binary files for Android. Follow the below tricks :
a. Error related to
declspec(dllexport) x
. It comes in 3rd party library freetype that comes with OCC insidefreetype-x.x.x/include/config/ftoption.h
. It can resolved by commenting out the line number (282 if OCC 7.0.0 is used) given in the error and entering#define FT_EXPORT_DEF(x) x
in place of it.b. Use the make command to start building again.
c. Paste freetype.so in
freetype-xx/lib
. Copy libEGL.so from..\android-ndk\platforms\android-xx\arch-arm\usr\lib
and paste it infreetype-xx/lib
.d. Open inc folder for CMake output folder given in step 1. Copy the contents in
..\android-ndk\platforms\android-xx\arch-arm\usr\include
and paste in inc folder. Follow step 4.b.
NOTE : android-xx depends on ANDROID_NATIVE_API_LEVEL. It can be android-15.
- If no errors are there then continue to follow the step 1 URL.
- After successful installation, go to CMake output directory and look for lib folder in any subfolders (may be lin32/gcc/lib). Inside lib folder all the required binary files will be there.
- I've created the binaries. download from here and copy the binaries in
jnilibs
folder in project. - Apart from freetype no other 3rd party library is required.
Now coming back to the question - gnustl_shared
is not reuired to add as an external binary.
Inside app\build.gradle
use below code
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'
}
Inside local.properties
add below snippets.
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
For OcctJniActivity.java
remove freeimage
. replace TKJniSample
with
// application code
|| !loadLibVerbose ("OcctJni_Viewer", aLoaded, aFailed))
NOTE :
Use latest gradle experiment for the sample.
Don't forget to add Shaders in assest folder. Others are not required for this sample
I have used OCC 7.0.0 and latest Android Studio.
I am attaching source code and OCC/include folder.
Answered By - Mohammad Tauqir
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.