我在sharedUserID中感到困惑.什么是使用sharedUserId?如何使用?在android中使用哪里?
这更像是一个答案,而不是一个问题,因为我已经弄明白了,至少就干净地编译图书馆而言.对我来说,主要问题是让shared_ptr工作.
配料:
Boost v.1.45.0
STLport的版本位于http://www.anddev.org/viewtopic.php?p=29939.
NDK的版本r4b.
路线:
在你的Android.mk文件中添加:
LOCAL_CFLAGS += -DBOOST_EXCEPTION_DISABLE -D_STLP_NO_EXCEPTIONS -DOS_ANDROID -D_STLP_USE_SIMPLE_NODE_ALLOC
Run Code Online (Sandbox Code Playgroud)
在stlport/stl/_string.h的第613行删除对__stl_throw_length_error的调用.如果您愿意,可以使用_STLP_NO_EXCEPTIONS.
在第261行之后编辑boost/boost/smart_ptr/shared_ptr.hpp以消除对shared_ptr构造函数中对boost :: throw_exception的调用.我在方法的整个主体周围使用了#ifndef BOOST_EXCEPTION_DISABLE.(但请参阅下面的答案.)
接下来你需要提供一些缺失的部分.使用以下内容创建头文件:
#ifdef OS_ANDROID
#include <exception>
namespace std
{
struct bad_alloc : public exception { bad_alloc operator()(){}};
}
#endif
Run Code Online (Sandbox Code Playgroud)
和一个带有精简异常类的源文件,以支持bad_alloc:
#ifdef OS_ANDROID
#include <exception>
namespace std
{
exception::exception() {}
exception::~exception() {}
const char* exception::what() const {}
}
#endif
Run Code Online (Sandbox Code Playgroud)
在包含boost/shared_ptr.hpp的任何地方都包含标题.编译源代码并将其添加到库中.
是否有预处理器宏让我知道ndk正在编译我的代码?我可以手动定义自己的,但如果可能,我宁愿不要.
我正在使用我的新应用程序处理从手机摄像头捕获的图像.我的手机是Nexus S,2.3.4.
我用捕获的数据创建了一个ARGB_8888位图.我知道ndk图片库,但它只支持2.2及以上版本.所以我将Bitmap的int []传递给NDK,发现颜色字节顺序是little-endian.
我搜索了wiki,发现arm架构是双端的. http://en.wikipedia.org/wiki/Endianness#Bi-endian_hardware
我的问题是如果arm是双端的,如何判断特定设备中的字节顺序?我应该在每次访问数据之前测试字节顺序吗?
我在我的应用程序中使用本机库,该库仅为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的C代码,可以进行大量的低级数字运算.我想知道我应该使用哪些设置(例如我的Android.mk和Application.mk),以便生成的代码可以在所有当前的Android设备上运行,但也可以利用特定芯片组的优化.我正在寻找使用良好的默认Android.mk和Application.mk设置,我想避免使用#ifdef分支丢弃我的C代码.
例如,我知道ARMv7有浮点指令,一些ARMv7芯片支持NEON指令,默认ARM不支持这些指令.是否可以设置标志,以便我可以使用NEON,没有NEON的ARMv7和默认的ARM构建来构建ARMv7?我知道如何做后两者但不是全部3.我对我使用的设置持谨慎态度,因为我认为当前默认设置是最安全的设置以及其他选项有哪些风险.
对于GCC特定的优化,我使用以下标志:
LOCAL_CFLAGS=-ffast-math -O3 -funroll-loops
Run Code Online (Sandbox Code Playgroud)
我检查了所有这三个加速了我的代码.还有其他我可以添加的常见内容吗?
我的另一个提示是将"LOCAL_ARM_MODE:= arm"添加到Android.mk以加快更新的手臂芯片(尽管我对这件事以及旧芯片上发生的事情感到困惑).
我想通过向logcat插入日志消息来调试JNI C应用程序.执行此操作的C API是什么?
当我在Android L(Nexus 5)上运行本机代码时,我收到错误.
错误:仅支持位置独立可执行文件(PIE).
在我的三星Galaxy S3(Android 4.3)上正确执行相同的代码.
这是我的Application.mk
APP_PROJECT_PATH := $(call my-dir)/..
APP_ABI := armeabi
NDK_TOOLCHAIN_VERSION := 4.7
APP_PLATFORM := android-9
APP_GNUSTL_FORCE_CPP_FEATURES := exceptions rtti
Run Code Online (Sandbox Code Playgroud)
但是,当我替换APP_PLATFORM := android-9为APP_PLATFORM := android-16(正如我在这里阅读,PIE支持出现在Jelly Been(API级别16)),相同的可执行文件在Android L上正常工作.
有没有办法APP_PLATFORM := android-9在Android L上使用并运行它来编译本机代码?
我需要使用NDK和JNI将一些函数实现到Android应用程序中.
以下是我编写的C代码,我的问题是:
#include <jni.h>
#include <stdio.h>
jobject
Java_com_example_ndktest_NDKTest_ImageRef(JNIEnv* env, jobject obj, jint width, jint height, jbyteArray myArray)
{
jint i;
jobject object;
jmethodID constructor;
jobject cls;
cls = (*env)->FindClass(env, "com/example/ndktest/NDKTest/Point");
//what should put as the second parameter? Is my try correct, according to what
//you can find in .java file? I used this documentation: http://download.oracle.com/javase/6/docs/technotes/guides/jni/spec/functions.html#wp16027
constructor = (*env)->GetMethodID(env, cls, "<init>", "void(V)");
//http://download.oracle.com/javase/6/docs/technotes/guides/jni/spec/functions.html#wp16660
//Again, is the last parameter ok?
object = (*env)->NewObject(env, cls, constructor, 5, 6);
//I want to assign "5" …Run Code Online (Sandbox Code Playgroud) 这个问题是继续我应该在Android中选择Boost Asio或Aysnc Socket线程吗?问:
Boost库旨在广泛使用,并可在各种应用程序中使用,但Android和iOS尚无官方支持
仅供参考.我一直在使用以下链接创建示例Android应用程序,但尚未成功:(
https://github.com/MysticTreeGames/Boost-for-Android
http://www.codexperiments.com/android/2011/05/tips-tricks-building-boost-with-ndk-r5/
如何将boost库(包括shared_ptr)与Android NDK和STLport一起使用
https://sites.google.com/site/fourdollars/android/android-mk
https://groups.google.com/forum/?fromgroups=#!topic/android-ndk/4lxhsKFe7Ho
http://www.crystax.net/trac/ndk/ticket/6
提前致谢.
android-ndk ×10
android ×9
boost ×2
c ×2
java ×2
boost-asio ×1
c++ ×1
gcc ×1
ios ×1
ndk-build ×1
preprocessor ×1
stlport ×1