我在我的应用程序中使用本机库,该库仅为armeabi,armeabi-v7a和x86编译.
在像Samsung S6这样的64位设备上加载此库时,应用程序崩溃并出现UnsatisfiedLinkError
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.myapp-2/base.apk"],nativeLibraryDirectories=[/data/app/com.myapp-2/lib/arm64, /vendor/lib64, /system/lib64]]] couldn't find "libfoo.so"
at java.lang.Runtime.loadLibrary(Runtime.java:366)
at java.lang.System.loadLibrary(System.java:989)
Run Code Online (Sandbox Code Playgroud)
不幸的是,图书馆是封闭的来源.有没有办法解决这个问题而无需使用64位目标重新编译库?
android studio项目CMake
与NDK
构建之间的实际区别是什么?我已经通过谷歌文档,但概念尚不清楚.根据谷歌文档:
Android原生开发工具包(NDK):一个工具集,允许您在Android中使用C和C++代码,并提供平台库,允许您管理本机活动并访问物理设备组件,如传感器和触摸输入.
CMake:一个外部构建工具,与Gradle一起构建您的本机库.如果您只打算使用ndk-build,则不需要此组件.
当我们需要使用什么时,任何人都可以用一个例子得到更好的解释吗?
我的应用程序具有以下结构
Android
|
|-> app
| |
| |-> build [1]
| |-> src
| | |-> main
| | | |-> assets
| | | |-> java
| | | |-> jni
| | | | |-> Android.mk
| | | | |-> Application.mk
| | | |
| | | |-> jniLibs
| | | | |-> armeabi
| | | | |-> armeabi-v7a
| | | |
| | | |-> res
| | | |-> AndroidManifest.xml …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用
std::function
Run Code Online (Sandbox Code Playgroud)
但是编译器会抛出错误
Error:(50, 10) error: no type named 'function' in namespace 'std'
Run Code Online (Sandbox Code Playgroud)
我试图修改build.gradle文件
externalNativeBuild {
ndkBuild {
path "src/main/jni/Android.mk"
}
cmake {
cppFlags "-std=c++11"
arguments "-DANDROID_STL=gnustl_static"
path 'src/main/jni/CMakeLists.txt'
}
}
Run Code Online (Sandbox Code Playgroud)
但它不接受除以外的参数path
并抛出以下错误
Error:(28, 0) Could not find method arguments() for arguments [-DANDROID_STL=gnustl_static] on object of type com.android.build.gradle.internal.dsl.CmakeOptions.
Run Code Online (Sandbox Code Playgroud)
请帮助我使用
std::function
Run Code Online (Sandbox Code Playgroud)
UPDATE
感谢@Alex Cohn我能够配置标志和参数,现在我的文件看起来像那样
apply plugin: 'com.android.library'
android {
compileSdkVersion 25
buildToolsVersion '26.0.2'
defaultConfig {
minSdkVersion 15
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake …
Run Code Online (Sandbox Code Playgroud) 我需要在Application.mk文件中指定库的路径以正确链接它.这该怎么做?是否有任何GCC命令?
我正在尝试将ndkBuild功能集成到现有的android studio项目中,使用新的android studio 2.2,以便启用c ++调试等.我已经尝试了android studio 2.2提供的ndk示例项目之一,它完美地工作精细.但是,当我尝试在我自己的项目中运行gradle命令时,我收到以下错误消息:
错误:(73,0)无法在类型为org.gradle.api.Project的项目':core'上找到参数[build_c6heui1f67l8o1c3ifgpntw6 $ _run_closure2 $ _closure9 @ 4329c1c9]的方法externalNativeBuild().
通过以下描述 http://tools.android.com/tech-docs/external-c-builds 我得到了一个包含以下命令的gradle脚本:
externalNativeBuild{
ndkBuild{
path "$projectDir/jni/Android.mk"
}
}
externalNativeBuild {
ndkBuild {
arguments "NDK_APPLICATION_MK:=$projectDir/jni/Application.mk"
abiFilters "armeabi-v7a", "armeabi","arm64-v8a","x86"
cppFlags "-frtti -fexceptions"
}
}
Run Code Online (Sandbox Code Playgroud)
我是否可能错过了项目设置的内容?我已正确设置Android NDK位置
文件 - >项目结构... - > SDK位置 - > Android NDK位置
在我的android工作室.
还有什么我可能有的东西吗?
有没有人遇到过类似的问题?
建议将非常感谢=)
java-native-interface android-ndk build.gradle ndk-build android-studio-2.2
我最近从Eclipse + ADT切换到Android Studio.我的应用程序是完整的本机C++应用程序.我使用Android Studio 2.0 Beta 5和Gradle Experimental 0.6.0-beta4.
Android Studio的构建过程对于本机代码来说非常慢.我阅读了有关Stackoverflow和Internet的所有问题.我应用了所有建议的方法(--offline, - damon, - parallel,-XmxSize等).它们主要用于加速Java代码的构建.本机C++文件(ndk-build)的编译过程仍然很慢.即使我编写一行C++代码,每次单击"运行"按钮时,我等待5-7分钟,其中Eclipse的编译时间大约为15-20秒,对于同一个作业.
您有什么建议加快Android Studio上本机代码(C/C++)的编译过程吗?
android android-ndk android-studio ndk-build gradle-experimental
执行任务:[干净]
按需配置是一个孵化功能。NDK 缺少“平台”目录。如果您使用 NDK,请确认 ndk.dir 设置为有效的 NDK 目录。当前设置为 /Users/ishandutta2007/Library/Android/sdk/ndk-bundle。如果您没有使用 NDK,请从 ANDROID_NDK_HOME 或 local.properties 中取消设置 NDK 变量以消除此警告。
项目 ':app' 中的配置 'compile' 已弃用。改用“实现”。
FAILURE:构建失败,出现异常。
出了什么问题:配置项目“:app”时出现问题。
java.lang.NullPointerException(无错误信息)
尝试:使用 --info 或 --debug 选项运行以获得更多日志输出。
例外是:org.gradle.api.ProjectConfigurationException:配置项目“:app”时出现问题。在 org.gradle.configuration.project.LifecycleProjectEvaluator.addConfigurationFailure(LifecycleProjectEvaluator.java:87) 在 org.gradle.configuration.project.LifecycleProjectEvaluator.notifyAfterEvaluate(LifecycleProjectEvaluator.java:82) 在 org.gradle.configuration.project.LifecycleProjectEvaluator.doConfigure (LifecycleProjectEvaluator.java:69) at org.gradle.configuration.project.LifecycleProjectEvaluator.access$100(LifecycleProjectEvaluator.java:33) at org.gradle.configuration.project.LifecycleProjectEvaluator$ConfigureProject.run(LifecycleProjectEvaluator.java:103) at org .gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:
在https://help.gradle.org获取更多帮助
3 秒内构建失败
build.gradle(项目)
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0-beta2'
}
}
allprojects {
repositories { …
Run Code Online (Sandbox Code Playgroud) 我正在尝试调试此错误:
01-12 13:38:18.068 275-275/? I/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
01-12 13:38:18.068 275-275/? I/DEBUG: Build fingerprint: 'samsung/a53gxx/a53g:5.0.2/LRX22G/A500HXXU1BOJ2:user/release-keys'
01-12 13:38:18.068 275-275/? I/DEBUG: Revision: '10'
01-12 13:38:18.068 275-275/? I/DEBUG: ABI: 'arm'
01-12 13:38:18.068 275-275/? I/DEBUG: pid: 19854, tid: 19854, name: arif.mercuryapp >>> com.hermessharif.mercuryapp <<<
01-12 13:38:18.068 275-275/? I/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0
01-12 13:38:18.098 275-275/? I/DEBUG: r0 00000000 r1 00000000 r2 00000001 r3 b6ecbf44
01-12 13:38:18.098 …
Run Code Online (Sandbox Code Playgroud) 我正在尝试在 Android Sudio 3.5 ( https://gitlab.freedesktop.org/gstreamer/gst-docs/tree/master/examples/tutorials/android)(https://gitlab.com /eduardoprado/gstreamer-tutorial5)但得到以下错误:
ERROR: Cause: executing external native build for ndkBuild C:\Users\Downloads\gst_docs_master_examples_tutorials_android\examples\tutorials\android\android-tutorial-1\jni\Android.mk.
Run Code Online (Sandbox Code Playgroud)
我一直在关注 gstreamer 网站上的 gstreamer android 教程以及Android Studio 中的 stackoverflow 线程Gstreamer 示例。
第一个目标是让 gstreamer 在 android studio 上运行。
有一些线程错误与路径目录中的空格有关,但我已经检查过并且所有文件夹都没有空格。以下是我一直在使用并调整以运行本教程的一些文件。
我还将 Windows 环境变量 GSTREAMER_ROOT_ANDROID 设置为解压缩的 gstreamer 二进制文件,并将其设置在 android.mk 文件中。
local.properties 文件
## This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only …
Run Code Online (Sandbox Code Playgroud) ndk-build ×10
android-ndk ×9
android ×8
c++ ×2
build.gradle ×1
cmake ×1
gstreamer ×1
ndk-stack ×1