我正在开发一个使用NDK功能的Android应用.我的应用程序定义android:minSdkVersion,并android:targetSdkVersion在AndroidManifest.xml和APP_PLATFORM在JNI/Application.mk.
我目前的理解是android:minSdkVersiondecalres支持的最小操作系统版本,android:targetSdkVersion声明要链接的Java库版本,并APP_PLATFORM声明要链接的C++库.
两个问题:
我的理解是否正确?
是否APP_PLATFORM更好android:minSdkVersion呢?或者他们必须彼此平等?
我的问题的原因:我希望我的应用程序可用于API> = 10的设备,但我需要使用在NDK AMotionEvent_getAxisValue中的platforms\android-13文件夹中定义的NDK函数(如).所以我用android:minSdkVersion=10和APP_PLATFORM=13.项目编译成功,但是它可以在API 10-12设备上运行吗?
最近我升级了NDK,现在我的应用程序因缺少符号而崩溃mkfifo:
E/dalvikvm(2031): dlopen("/data/app-lib/...mylib.so") failed: Cannot load library: soinfo_relocate(linker.cpp:975): cannot locate symbol "mkfifo" referenced by "mylib.so"...
Run Code Online (Sandbox Code Playgroud)
较旧的平台mkfifo是内联定义的 sys/stat.h
static __inline__ int mkfifo(const char *__p, mode_t __m) {
return mknod(__p, (__m & ~S_IFMT) | S_IFIFO, (dev_t)0);
}
Run Code Online (Sandbox Code Playgroud)
但是在平台版本21中,它被改为仅仅是一个外部的decleration:
extern int mkfifo(const char*, mode_t);
Run Code Online (Sandbox Code Playgroud)
这就解释了缺失的符号异常...我的问题是如何解决它?
我正在尝试运行一个集成了android ndk 的库的演示应用程序.我已在Android工作室中导入此代码,并下载了ndk并将其与项目相关联.代码编译并成功构建.它会导致崩溃异常"初始化时抛出异常ljava lang unfisfiedlinkerror"失败:dlopen失败:无法找到"libtangram.so"引用的符号"_ZN7Tangram11setPositionEdd"......"
Application.mk:
APP_STL := c++_shared
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi armeabi-v7a x86 mips
APP_PLATFORM := android-19
Run Code Online (Sandbox Code Playgroud)
Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := tangram
LOCAL_SRC_FILES := jniExports.cpp jniGenerated.cpp platform_android.cpp
LOCAL_LDLIBS := -llog
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
include $(BUILD_SHARED_LIBRARY)
Run Code Online (Sandbox Code Playgroud)
模块Gradle文件:
buildscript {
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
classpath 'com.github.dcendents:android-maven-plugin:1.2'
}
}
apply plugin: 'com.android.library'
apply plugin: 'com.github.dcendents.android-maven'
group = GROUP
version = VERSION_NAME
android {
compileSdkVersion 22
buildToolsVersion "21.1.2"
defaultConfig { …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Android NDK为x86_64架构编译Lame声音库.我收到以下链接错误未定义引用bcopy和index:
jni/libmp3lame/encoder.c:471: error: undefined reference to 'bcopy'
jni/libmp3lame/encoder.c:476: error: undefined reference to 'bcopy'
jni/libmp3lame/id3tag.c:1125: error: undefined reference to 'index'
jni/libmp3lame/newmdct.c:1036: error: undefined reference to 'bcopy'
jni/libmp3lame/util.c:685: error: undefined reference to 'bcopy'
Run Code Online (Sandbox Code Playgroud)
代码成功编译了x86和arm架构.
因此,我通过NDK的libs挖了一下,发现bcopy和index都出口了libc.so用于x86和ARM平台,而不是x86_64的(见下文objdump输出).
$> objdump -d android-ndk-r10d/platforms/android-21/arch-arm/usr/lib/libc.so | grep bcopy -A 6
0000b000 <bcopy>:
b000: e52db004 push {fp} ; (str fp, [sp, #-4]!)
b004: e28db000 add fp, sp, #0
b008: e28bd000 add sp, fp, #0
b00c: e8bd0800 …Run Code Online (Sandbox Code Playgroud) 我试图在Android设备上运行我的cocos2d-x游戏,它在android 5.0(棒棒糖)上运行完美,但在较低的Android版本上崩溃.我收到以下错误:
02-25 10:41:09.787:E/ResourceType(18090):0x5ad385b8:无法ResTable :: remove()cookie = 0x3,而不是最后一个表.mHeaders.size()= 4.警告垃圾收集器运行时发生自发崩溃.02-25 10:41:09.797:E/asset(18090):删除运行时外观资源时出错(cookie 0x3)02-25 10:41:09.797:I/asset(18090):删除所有运行时外观资源时出现问题02-25 10:41:09.817:D/dalvikvm(18090):试图加载lib /data/app-lib/com.example.game-2/libcocos2dcpp.so 0x418c9ce8 02-25 10:41:09.817:E/dalvikvm(18090) ):dlopen("/ data/app-lib/com.example.game-2/libcocos2dcpp.so")失败:dlopen失败:无法找到"libcocos2dcpp.so"引用的符号"atof"... 02-25 10 :41:09.817:W/dalvikvm(18090):Exception Ljava/lang/UnsatisfiedLinkError; 在初始化Lcom/example/game/game时抛出; 02-25 10:41:09.817:W/dalvikvm(18090):类初始化失败在newInstance调用中(Lcom/example/game/game;)02-25 10:41:09.817:D/AndroidRuntime(18090):关闭VM 02-25 10:41:09.817:W/dalvikvm(18090):threadid = 1:线程退出未捕获异常(组= 0x415af8b0)02-25 10:41:09.827:E/AndroidRuntime(18090):致命异常: main 02-25 10:41:09.827:E/AndroidRuntime(18090):java.lang.UnsatisfiedLinkError:dlopen failed:找不到"libcocos2dcpp.so"引用的符号"atof"... 02-25 10:41:09.827 :E/AndroidRuntime(18090):at java.lang.Runtime.loadLibrary(Runtime.java:361)example 02-25 10:41:09.827:E/AndroidRuntime(18090):at java.lang.System.loadLibrary(System .java:525)02-25 10:41:09.827:E/AndroidRuntime(18090):at com.example.game.game.(game.java:126)02-25 10:41:09.827:E/AndroidRuntime( 18090):at java.lang.Class.newInstanceImpl(Native Method)02-25 10:41:09.827:E/AndroidRuntime(18090):at java.lang.Class.newInstance(Class.java:1130)02-25 10 :41:09.827:E/AndroidRun time(18090):at android.app.Instrumentation.newActivity(Instrumentation.java:1061)02-25 10:41:09.827:E/AndroidRuntime(18090):at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2178 )02-25 10:41:09.827:E/AndroidRuntime(18090):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2311)02-25 10:41:09.827:E/AndroidRuntime(18090):at android .app.ActivityThread.access $ 600(ActivityThread.java:149)02-25 10:41:09.827:E/AndroidRuntime(18090):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1293)02-25 10:41:09.827:E/AndroidRuntime(18090):在android.os.Handler.dispatchMessage(Handler.java:99)02-25 10:41:09.827:E/AndroidRuntime(18090):在android.os.Looper .loop(Looper.java:137)02-25 10:41:09.827:E/AndroidRuntime(18090):at android.app.ActivityThread.main(ActivityThread.java:5214)02-25 10:41:09.827:E/AndroidRuntime(18090):at java.lang.reflect.Method.invokeNative(Native Method)02-25 10:41:09.827:E/AndroidRuntime(18090):at j …
我正在尝试使用libvpx安装Android x86的webm解码器.
我通过以下命令构建了库并获得了"libvpx.a".
../configure --target=x86-android-gcc --disable-vp8-encoder --disable-vp9-encoder --disable-examples --sdk-path=$ANDROID_NDK_ROOT --enable-pic --enable-postproc
Run Code Online (Sandbox Code Playgroud)
当我在Windows上使用此库是ndk-build时,发生了错误.
C:/android/[project]/jni/../plib/libvpx.a(postproc_mmx.asm.o)(.text+0x1c8): error: undefined reference to 'rand'
C:/android/[project]/jni/../plib/libvpx.a(postproc_sse2.asm.o)(.text+0x65c): error: undefined reference to 'rand'
collect2.exe: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
libmepx.a for armeabi没有出现错误.有人不知道解决方案吗?
(JNI/Android.mk)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := sublib
LOCAL_SRC_FILES := sublib.cpp
LOCAL_LDLIBS := -llog
LOCAL_STATIC_LIBRARIES := libvpx_pre
include $(BUILD_SHARED_LIBRARY)
include $(LOCAL_PATH)/../plib/Android_x86.mk
Run Code Online (Sandbox Code Playgroud)
(PLIB/Android_x86.mk)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libvpx_pre
LOCAL_SRC_FILES := libvpx.a
LOCAL_STATIC_LIBRARIES := cpufeatures
include $(PREBUILT_STATIC_LIBRARY)
$(call import-module,android/cpufeatures)
Run Code Online (Sandbox Code Playgroud) 我一直在争取在Android上使用Cpp程序几天,我遇到了一个我认为可能是个bug的问题.我正在使用SDL2,但没有其他库,我也在使用SDL android项目模板.
基本程序运行正常,但我想使用Cpp stdlibs和STL,所以根据说明,我将APP_STL:= stlport_static添加到Application.mk并重建程序但是此后应用程序只显示一个空白屏幕一段时间然后崩溃,调试说如下:
01-20 22:10:14.817: D/dalvikvm(26097): Trying to load lib /data/data/com.kebabkeisari.peli/lib/libSDL2.so 0x41d06890
01-20 22:10:14.817: W/dalvikvm(26097): Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lorg/libsdl/app/SDLActivity;
01-20 22:10:14.817: W/dalvikvm(26097): Class init failed in newInstance call (Lcom/kebabkeisari/peli/Ribale;)
01-20 22:10:14.822: D/AndroidRuntime(26097): Shutting down VM
01-20 22:10:14.822: W/dalvikvm(26097): threadid=1: thread exiting with uncaught exception (group=0x4109f2a0)
01-20 22:10:14.827: E/AndroidRuntime(26097): FATAL EXCEPTION: main
01-20 22:10:14.827: E/AndroidRuntime(26097): java.lang.ExceptionInInitializerError
01-20 22:10:14.827: E/AndroidRuntime(26097): at java.lang.Class.newInstanceImpl(Native Method)
01-20 22:10:14.827: E/AndroidRuntime(26097): at java.lang.Class.newInstance(Class.java:1319)
01-20 22:10:14.827: E/AndroidRuntime(26097): at android.app.Instrumentation.newActivity(Instrumentation.java:1057)
01-20 22:10:14.827: E/AndroidRuntime(26097): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2015) …Run Code Online (Sandbox Code Playgroud) android ×7
android-ndk ×6
c++ ×2
android-x86 ×1
c ×1
cocos2d-x ×1
eclipse ×1
java ×1
libvpx ×1