我一直在努力将Android本机Java代码库移植到使用等级构建的Plain Java应用程序中。
Android代码的build.gradle文件使用C ++代码,并且此依赖项已声明如下。
android {
...
externalNativeBuild {
cmake {
path file('src/main/cpp/CMakeLists.txt')
}
}
}
对于使用Gradle生成的Java应用程序执行此操作的正确方法是什么(我遵循this教程)
这是到目前为止我的build.grade文件的外观。
plugins {
id 'java'
id 'application'
}
repositories {
jcenter()
}
dependencies {
implementation 'com.google.guava:guava:28.0-jre'
testImplementation 'junit:junit:4.12'
implementation 'org.greenrobot:eventbus:3.1.1'
}
application {
mainClassName = 'demo.App'
}
我正在使用Java 8,并且gradle版本是5.6.2,openjdk版本1.8.0_222
EDIT:环顾四周后,我知道可以使用JNI在Java中使用C ++。
但是在android studio中,Android项目可以在创建时配置为使用C ++。另外,该项目使用了makefile,不确定如何使用JNI来完成此操作
最后得到了它的工作,这是它的工作方式,假设我想从Java中执行System.loadLibrary(“ nativeCpp”)
步骤1:
将所有C ++代码移至src/nativeCpp/cpp/
并删除CMAKE.txt文件。
步骤2:确保build.gradle如下所示:
plugins {
id 'java'
id 'application'
id 'cpp'
}
repositories {
jcenter()
}
dependencies {
implementation 'com.google.guava:guava:28.0-jre'
testImplementation 'junit:junit:4.12'
}
application {
mainClassName = 'demo.App'
}
run {
systemProperty "java.library.path", file("${buildDir}/libs/nativeCpp/shared").absolutePath
}
model {
platforms {
x64 {
architecture "x64"
}
}
components {
nativeCpp(NativeLibrarySpec) {
binaries.all {
cppCompiler.args '-I', "${org.gradle.internal.jvm.Jvm.current().javaHome}/include"
cppCompiler.args '-I', "${org.gradle.internal.jvm.Jvm.current().javaHome}/include/linux"
cppCompiler.args '-fPIC'
}
}
}
}
run.dependsOn 'nativeCppSharedLibrary'
说明: Gradle要求您将所有本机组件及其名称保存在src目录中,它引用此目录(在我的情况下为src / nativeApp)来构建您的本机代码。
当您使用gradle run
执行运行任务时,要从build.gradle的run属性中选择要传递给语言编译器(在这种情况下为Java)的任何特殊指令。我想传递java.library.path
以确保Java可以读取它,没有它,您将在构建期间得到java.lang.UnsatisfiedLinkError
。
接下来,我们在模型块内定义组件以及如何构建它们,binaries.all
属性中的指令在命令行中转换为此:
gcc -I /usr/lib/jvm/java-1.8.0-openjdk-amd64/include -I /usr/lib/jvm/java-1.8.0-openjdk-amd64/include/linux -shared -o librendering.so native.cpp -fPIC
我们指定-I选项,以告诉gcc编译器JNI在我们系统上的位置。该路径可能因您而异。
这将编译您的C ++代码并将其存储在/libs/nativeCpp/shared
可以找到它的run
中