-
Notifications
You must be signed in to change notification settings - Fork 173
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add example for LASlib using Gradle JavaCPP with Android Studio (pull #…
…58)
- Loading branch information
Showing
11 changed files
with
454 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,98 @@ | ||
plugins { | ||
id 'com.android.library' | ||
id 'org.bytedeco.gradle-javacpp-build' version '1.5.6' | ||
} | ||
|
||
android { | ||
compileSdkVersion 30 | ||
buildToolsVersion "30.0.3" | ||
ndkVersion "21.4.7075529" | ||
|
||
defaultConfig { | ||
minSdkVersion 19 | ||
targetSdkVersion 30 | ||
versionCode 1 | ||
versionName "1.0" | ||
|
||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" | ||
consumerProguardFiles 'consumer-rules.pro' | ||
|
||
externalNativeBuild { | ||
cmake { | ||
arguments '-DANDROID_STL=c++_static' | ||
} | ||
ndkBuild { | ||
// multicore build | ||
arguments "-j" + Runtime.runtime.availableProcessors() | ||
} | ||
} | ||
ndk { | ||
abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64" | ||
} | ||
} | ||
|
||
externalNativeBuild { | ||
cmake { | ||
path file('src/main/cpp/CMakeLists.txt') | ||
} | ||
} | ||
|
||
buildTypes { | ||
release { | ||
minifyEnabled false | ||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' | ||
} | ||
} | ||
|
||
compileOptions { | ||
sourceCompatibility JavaVersion.VERSION_1_8 | ||
targetCompatibility JavaVersion.VERSION_1_8 | ||
} | ||
|
||
libraryVariants.all { variant -> | ||
def variantName = variant.name.capitalize() // either "Debug" or "Release" | ||
def javaCompile = project.tasks.getByName("compile${variantName}JavaWithJavac") | ||
def generateJson = project.tasks.getByName("generateJsonModel$variantName") | ||
|
||
// Compiles NativeLibraryConfig.java | ||
task "javacppCompileJava$variantName"(type: JavaCompile) { | ||
include 'com/senter/lastools/NativeLibraryConfig.java' | ||
source = javaCompile.source | ||
classpath = javaCompile.classpath | ||
destinationDir = javaCompile.destinationDir | ||
} | ||
|
||
// Parses included .h header files and outputs <TargetClassName>.java configured in NativeLibraryConfig.java | ||
task "javacppBuildParser$variantName"(type: org.bytedeco.gradle.javacpp.BuildTask) { | ||
dependsOn "javacppCompileJava$variantName" | ||
classPath = [javaCompile.destinationDir] | ||
// includePath contains places to search for header files configured in NativeLibraryConfig.java | ||
includePath = ["$projectDir/src/main/cpp/LASzip/src", "$projectDir/src/main/cpp/LASlib/inc"] | ||
classOrPackageNames = ['com.senter.lastools.NativeLibraryConfig'] | ||
outputDirectory = file("$projectDir/src/main/java/") | ||
} | ||
|
||
// Compiles <TargetClassName>.java and everything else | ||
javaCompile.dependsOn "javacppBuildParser$variantName" | ||
|
||
// Generates jnijavacpp.cpp and <Library Name>.cpp | ||
task "javacppBuildCompiler$variantName"(type: org.bytedeco.gradle.javacpp.BuildTask) { | ||
dependsOn javaCompile | ||
classPath = [javaCompile.destinationDir] | ||
classOrPackageNames = ['com.senter.lastools.LasLib'] | ||
compile = false | ||
deleteJniFiles = false | ||
outputDirectory = file("$projectDir/src/main/cpp/LASlib/") | ||
} | ||
|
||
// Picks up the C++ files listed in CMakeLists.txt | ||
generateJson.dependsOn "javacppBuildCompiler$variantName" | ||
} | ||
} | ||
|
||
dependencies { | ||
implementation fileTree(dir: 'libs', include: ['*.jar']) | ||
|
||
implementation 'org.bytedeco:javacpp:1.5.6' | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" | ||
package="com.senter.lastools" /> |
39 changes: 39 additions & 0 deletions
39
laslib-android/LAStools/src/main/java/com/senter/lastools/NativeLibraryConfig.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
package com.senter.lastools; | ||
|
||
import org.bytedeco.javacpp.annotation.Platform; | ||
import org.bytedeco.javacpp.annotation.Properties; | ||
import org.bytedeco.javacpp.tools.Info; | ||
import org.bytedeco.javacpp.tools.InfoMap; | ||
import org.bytedeco.javacpp.tools.InfoMapper; | ||
|
||
@Properties( | ||
// It's important that dependency headers go first, check https://github.com/bytedeco/javacpp/wiki/Mapping-Recipes#including-multiple-header-files | ||
value = @Platform( | ||
include = { | ||
// LASzip/src folder | ||
"mydefs.hpp", "lasquantizer.hpp", "lasattributer.hpp", "laszip.hpp", "laspoint.hpp" | ||
// LASlib | ||
, "lasvlr.hpp" | ||
, "lasdefinitions.hpp", "lasutility.hpp", "lasignore.hpp", "laswaveform13writer.hpp", "laswaveform13reader.hpp" | ||
, "laswriter.hpp", "lasreader.hpp" | ||
}, | ||
// A <Library Name>.cpp will be generated | ||
library = "jniLASlib"), | ||
// A <Target Class Name>.java will be generated | ||
target = "com.senter.lastools.LasLib" | ||
) | ||
public class NativeLibraryConfig implements InfoMapper { | ||
static { | ||
// Let Android take care of loading JNI libraries for us | ||
// System.setProperty("org.bytedeco.javacpp.loadLibraries", "false"); | ||
} | ||
|
||
public void map(InfoMap infoMap) { | ||
infoMap | ||
// skip the macro definition LASCopyString translation | ||
.put(new Info("LASCopyString").cppTypes("char *", "const char *").skip()) | ||
// macro _MSC_VER should not be valid on Android | ||
.put(new Info("defined(_MSC_VER)").define(false)) | ||
.put(new Info("_MSC_VER").define(false)); | ||
} | ||
} |
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
// Top-level build file where you can add configuration options common to all sub-projects/modules. | ||
buildscript { | ||
repositories { | ||
google() | ||
mavenCentral() | ||
jcenter() | ||
} | ||
dependencies { | ||
classpath "com.android.tools.build:gradle:3.6.3" | ||
|
||
// NOTE: Do not place your application dependencies here; they belong | ||
// in the individual module build.gradle files | ||
} | ||
} | ||
|
||
allprojects { | ||
repositories { | ||
google() | ||
mavenCentral() | ||
jcenter() | ||
} | ||
} | ||
|
||
task clean(type: Delete) { | ||
delete rootProject.buildDir | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
#!/bin/bash | ||
set -e | ||
set +x | ||
|
||
|
||
if [[ ! -d "$ANDROID_HOME/build-tools" ]]; then | ||
echo "Please download Android SDK first and set the SDK path to $ANDROID_HOME." | ||
exit | ||
fi | ||
|
||
cd LAStools/src/main | ||
if [[ ! -d "cpp" ]]; then | ||
git clone https://github.com/LAStools/LAStools.git cpp | ||
fi | ||
cd cpp | ||
git checkout 9ecb4e682153436b044adaeb3b4bfdf556109a0f | ||
|
||
echo "Decompressing modification archives..." | ||
tar -xzvf "../ndk_modifications.tgz" | ||
|
||
|
||
cd ../../../../ | ||
|
||
./gradlew assemble | ||
|
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
#Mon Nov 23 18:32:09 JST 2020 | ||
distributionBase=GRADLE_USER_HOME | ||
distributionPath=wrapper/dists | ||
zipStoreBase=GRADLE_USER_HOME | ||
zipStorePath=wrapper/dists | ||
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,172 @@ | ||
#!/usr/bin/env sh | ||
|
||
############################################################################## | ||
## | ||
## Gradle start up script for UN*X | ||
## | ||
############################################################################## | ||
|
||
# Attempt to set APP_HOME | ||
# Resolve links: $0 may be a link | ||
PRG="$0" | ||
# Need this for relative symlinks. | ||
while [ -h "$PRG" ] ; do | ||
ls=`ls -ld "$PRG"` | ||
link=`expr "$ls" : '.*-> \(.*\)$'` | ||
if expr "$link" : '/.*' > /dev/null; then | ||
PRG="$link" | ||
else | ||
PRG=`dirname "$PRG"`"/$link" | ||
fi | ||
done | ||
SAVED="`pwd`" | ||
cd "`dirname \"$PRG\"`/" >/dev/null | ||
APP_HOME="`pwd -P`" | ||
cd "$SAVED" >/dev/null | ||
|
||
APP_NAME="Gradle" | ||
APP_BASE_NAME=`basename "$0"` | ||
|
||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | ||
DEFAULT_JVM_OPTS="" | ||
|
||
# Use the maximum available, or set MAX_FD != -1 to use that value. | ||
MAX_FD="maximum" | ||
|
||
warn () { | ||
echo "$*" | ||
} | ||
|
||
die () { | ||
echo | ||
echo "$*" | ||
echo | ||
exit 1 | ||
} | ||
|
||
# OS specific support (must be 'true' or 'false'). | ||
cygwin=false | ||
msys=false | ||
darwin=false | ||
nonstop=false | ||
case "`uname`" in | ||
CYGWIN* ) | ||
cygwin=true | ||
;; | ||
Darwin* ) | ||
darwin=true | ||
;; | ||
MINGW* ) | ||
msys=true | ||
;; | ||
NONSTOP* ) | ||
nonstop=true | ||
;; | ||
esac | ||
|
||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar | ||
|
||
# Determine the Java command to use to start the JVM. | ||
if [ -n "$JAVA_HOME" ] ; then | ||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then | ||
# IBM's JDK on AIX uses strange locations for the executables | ||
JAVACMD="$JAVA_HOME/jre/sh/java" | ||
else | ||
JAVACMD="$JAVA_HOME/bin/java" | ||
fi | ||
if [ ! -x "$JAVACMD" ] ; then | ||
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME | ||
Please set the JAVA_HOME variable in your environment to match the | ||
location of your Java installation." | ||
fi | ||
else | ||
JAVACMD="java" | ||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. | ||
Please set the JAVA_HOME variable in your environment to match the | ||
location of your Java installation." | ||
fi | ||
|
||
# Increase the maximum file descriptors if we can. | ||
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then | ||
MAX_FD_LIMIT=`ulimit -H -n` | ||
if [ $? -eq 0 ] ; then | ||
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then | ||
MAX_FD="$MAX_FD_LIMIT" | ||
fi | ||
ulimit -n $MAX_FD | ||
if [ $? -ne 0 ] ; then | ||
warn "Could not set maximum file descriptor limit: $MAX_FD" | ||
fi | ||
else | ||
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" | ||
fi | ||
fi | ||
|
||
# For Darwin, add options to specify how the application appears in the dock | ||
if $darwin; then | ||
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" | ||
fi | ||
|
||
# For Cygwin, switch paths to Windows format before running java | ||
if $cygwin ; then | ||
APP_HOME=`cygpath --path --mixed "$APP_HOME"` | ||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` | ||
JAVACMD=`cygpath --unix "$JAVACMD"` | ||
|
||
# We build the pattern for arguments to be converted via cygpath | ||
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` | ||
SEP="" | ||
for dir in $ROOTDIRSRAW ; do | ||
ROOTDIRS="$ROOTDIRS$SEP$dir" | ||
SEP="|" | ||
done | ||
OURCYGPATTERN="(^($ROOTDIRS))" | ||
# Add a user-defined pattern to the cygpath arguments | ||
if [ "$GRADLE_CYGPATTERN" != "" ] ; then | ||
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" | ||
fi | ||
# Now convert the arguments - kludge to limit ourselves to /bin/sh | ||
i=0 | ||
for arg in "$@" ; do | ||
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` | ||
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option | ||
|
||
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition | ||
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` | ||
else | ||
eval `echo args$i`="\"$arg\"" | ||
fi | ||
i=$((i+1)) | ||
done | ||
case $i in | ||
(0) set -- ;; | ||
(1) set -- "$args0" ;; | ||
(2) set -- "$args0" "$args1" ;; | ||
(3) set -- "$args0" "$args1" "$args2" ;; | ||
(4) set -- "$args0" "$args1" "$args2" "$args3" ;; | ||
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; | ||
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; | ||
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; | ||
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; | ||
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; | ||
esac | ||
fi | ||
|
||
# Escape application args | ||
save () { | ||
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done | ||
echo " " | ||
} | ||
APP_ARGS=$(save "$@") | ||
|
||
# Collect all arguments for the java command, following the shell quoting and substitution rules | ||
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" | ||
|
||
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong | ||
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then | ||
cd "$(dirname "$0")" | ||
fi | ||
|
||
exec "$JAVACMD" "$@" |
Oops, something went wrong.