androidndkso
Ⅰ 求助,NDK编译时so遇到的问题
1.dr@drBox:~/workspace/JniTest/jni$ ~/android-ndk-r6/ndk-build Compile++ thumb : Test <= JniTest.cpp /bin/sh: /home/dr/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-g++: not found make: *** [/home/dr/workspace/JniTest/obj/local/armeabi/objs/Test/JniTest.o] Error 127
这个错误是说找不到arm-linux-androideabi-g++,确实找不到,我从ndk r6中发现根本就没有linux-x86/文件夹,只有darwin-x86 gdbserver这两个文件夹,所以下载了最新的ndk r7b,幸好这里面有linux-x86文件夹,编译成功了。
dr@drBox:~/workspace/JniTest/jni$ ~/android-ndk-r7b/ndk-build Compile++ thumb : Test <= JniTest.cpp StaticLibrary : libstdc++.a SharedLibrary : libTest.so Install : libTest.so => libs/armeabi/libTest.so
2.当只改动Android.mk文件后需要编译,这时mm执行后会报如下提示:
============================================ make: Entering directory `/home/dr/android4.0.3' make: Nothing to be done for `all_moles'. make: Leaving directory `/home/dr/android4.0.3'
说明没有文件改动,拒绝编译。
那么解决办法可以是去稍微改动一下cpp等文件,加个空格也行。但是还有一种方便的方式就是
给cpp文件加时间戳:touch *.cpp
这样就可以继续编译了,所有cpp文件的时间都更新为最新了。
Ⅱ 如何在Android NDK中调用第三方库文件(.so)
1.在project/jni目录下创建prebuilt子目录(目录名可自定义).
2.将第三方.so放到prebuilt中,并创建Android.mk, 内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := xxx
LOCAL_SRC_FILES := libxxx.so
include $(PREBUILT_SHARED_LIBRARY)
3.在project/jni/Android.mk中加入
LOCAL_SHARED_LIBRARIES := xxx
4.在project/jni/android.mk的最后加入
include $(LOCAL_PATH)/prebuilt/Android.mk
5.运行cygwin, 到project目录下, 运行$NDK/ndk-build
Ⅲ android ndk 怎样调用第三方的so库文件
问题描述:Android如何调用第三方SO库;
已知条件:SO库为Android版本连接库(*.so文件),并提供了详细的接口说明;
已了解解决方案:
1.将SO文件直接放到libs/armeabi下,然后代码中System.loadLibrary("xxx");再public native static int xxx_xxx_xxx();接下来就可以直接调用xxx_xxx_xxx()方法;
2.第二种方案,创建自己的SO文件,在自己的SO文件里调用第三方SO,再在程序中调用自己的SO,这种比较复杂,需要建java类文件,生成.h文件,编写C源文件include之前生成的.h文件并实现相应方法,最后用android NDK开发包中的ndk-build脚本生成对应的.so共享库;
求解:
1.上面两种方案是否可行?不可行的话存在什么问题?
2.两种方案有什么区别?为什么网上大部都是用的第二种方案?
3.只有一个*.so文件,并提供了详细的接口说明,是否可在ANDROID中使用它?
首先要看这个SO是不是JNI规范的SO,比如有没有返回JNI不直接支持的类型。也就是说这个SO是不是可以直接当作JNI来调用。如果答案是否定的,你只能选第二个方案。
如果答案是肯定的,还要看你是不是希望这个SO的库直接暴露给JAVA层,如果答案是否定的,你只能选第二个方案,比如你本身也是一个库的提供者。
一般如果你只有SO,就说明这个是别人提供给你的,你可以要求对方给你提供配套的JAVA调用文件。
1、这个要看这个SO是不是符合JNI调用的规范。还要看你自己的意愿。
2、因为第二种方法最灵活,各种情况都可以实现。
3、可以
看能不能直接从JAVA调用的最简单的方法就是看SO里的函数名是不是Java_XXX_XXX_XXX格式的
是就可以,你可以自己写一个配套的JAVA文件,注意一下SO函数名和JAVA函数名的转换规则,或者向SO提供方索要;
不是的话就选第二种方案吧。
1、检查所需文件是否齐全
使用第三方动态库,应该至少有2个文件,一个是动态库(.so),另一个是包含
动态库API声明的头文件(.h)
2、封装原动态库
原动态库文件不包含jni接口需要的信息,所以我们需要对其进行封装,所以我
们的需求是:将libadd.so 里面的API封装成带jni接口的动态
3、编写库的封装函数libaddjni.c
根据前面生成的com_android_libjni_LibJavaHeader.h 文件,编写libaddjni.c,用
来生成libaddjni.so
Android中集成第三方软件包(.jar, .so)
Android中可能会用到第三方的软件包,这包括Java包.jar和Native包.so。jar包既可通过Eclipse开发环境集成,也可通过编译源码集成,看你的工作环境。
假定自己开发的程序为MyMaps,需要用到BaiMaps的库,包括mapapi.jar和libBMapApiEngine_v1_3_1.so。
一、Eclipse中集成第三方jar包及.so动态库
MyMaps工程下创建目录libs以及libs/armeabi,把mapapi.jar放在的libs/目录下,把libBMapApiEngine_v1_3_1.so放在libs/armeabi/下。
Eclipse中把第三方jar包mapapi.jar打包到MyMaps的步骤:
1. 右击工程,选择Properties;
2. Java Build Path,选择Libraries;
3. Libraries页面点击右面按钮“Add Library…”;
4. 选择“User Library”,点击“Next”;
5. 点击“User Libraries”按钮;
6. 在弹出界面中,点击“New…”;
7. 输入“User library name”,点击“OK”确认;
8. 返回之后,选择刚刚创建的User library,右面点击“AddJARs”;
9. 选择MyMaps/libs/下的mapapi.jar;
10. 确认,返回。
这样,编译之后,该jar包就会被打进MyMaps.apk中,libBMapApiEngine_v1_3_1.so也被打包在lib/armeabi/中。
程序运行过程中,libBMapApiEngine_v1_3_1.so被放在/data/data/<yourAppPackage>/lib/下,加载动态库时系统会从程序的该lib/目录下查找.so库。
二、源码中集成第三方集成jar包及.so动态库
Android源码中MyMaps放在packages/apps下。MyMaps下创建目录libs以及libs/armeabi,并把mapapi.jar放在libs/,把libBMapApiEngine_v1_3_1.so放在libs/armeabi。
2.1 修改Android.mk文件
Android.mk文件如下:
[plain] view plain
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_STATIC_JAVA_LIBRARIES := libmapapi
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := MyMaps
include $(BUILD_PACKAGE)
##################################################
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES :=libmapapi:libs/mapapi.jar
LOCAL_PREBUILT_LIBS :=libBMapApiEngine_v1_3_1:libs/armeabi/libBMapApiEngine_v1_3_1.so
LOCAL_MODULE_TAGS := optional
include $(BUILD_MULTI_PREBUILT)
# Use the following include to make our testapk.
include $(callall-makefiles-under,$(LOCAL_PATH))
1 集成jar包
LOCAL_STATIC_JAVA_LIBRARIES取jar库的别名,可以任意取值;
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES指定prebuiltjar库的规则,格式:别名:jar文件路径。注意:别名一定要与LOCAL_STATIC_JAVA_LIBRARIES里所取的别名一致,且不含.jar;jar文件路径一定要是真实的存放第三方jar包的路径。
编译用BUILD_MULTI_PREBUILT。
2 集成.so动态库
LOCAL_PREBUILT_LIBS指定prebuilt so的规则,格式:别名:so文件路径。注意:别名一般不可改变,特别是第三方jar包使用.so库的情况,且不含.so;so文件路径一定要是真实的存放第三方so文件的路径。
编译拷贝用BUILD_MULTI_PREBUILT。
2.2 加入到GRANDFATHERED_USER_MODULES
在文件user_tags.mk中,把libBMapApiEngine_v1_3_1加入到GRANDFATHERED_USER_MODULES中
[plain] view plain
GRANDFATHERED_USER_MODULES += \
… \
libBMapApiEngine_v1_3_1
user_tags.mk可以是build/core下的,也可以是$(TARGET_DEVICE_DIR)下的,推荐修改$(TARGET_DEVICE_DIR)下的。
2.3 编译结果
MyMaps.apk编译生成在out/target/proct/<YourProct>/system/app/下;
libBMapApiEngine_v1_3_1.so放在out/target/proct/<YourProct>/system/lib/下,这也是系统加载动态库时搜索的路径。
Ⅳ “Android NDK ”是什么,在什么情况下使用
Android 应用是在dalvik虚拟机中运行的。NDK可以让你使用本地代码语言来开发应用,比如说C/C++,这种方法对某些类型的应用的是有好处的,可以充分利用本地代码和在某些情况下加速代码的执行。
对于绝大多数的应用来说,使用NDK并不是一个明智的选择,作为一个开发者,我们需要衡量它所带来的好处和缺点。使用本地代码并不一定可以使性能得到优化,但是通常使得应用代码变得复杂。一般来说,我们将应用中关键部分的代码用C/C++写,而不能由于我们习惯于用C/C++开发而把所有的代码都用C/C++来实现。
有下面这些特点的应用可以考虑使用NDK:
1 独立的,不和其他应用有关系的
2 频繁占用CPU但是申请的内存空间不是很大的操作,像信号的处理,物体的模拟等等
简单的用C/C++重写我们的代码是不会带来很大的性能提升的。
在考虑是否采用本地代码开发的时候,要结合应用的实际需求并且看看Android 的framework层是否提供了我们需要的API,但是用NDK可以充分利用本地已经有的代码。
Android framework提供下面两种方法来使用本地代码:
1 在Android framework的框架下面开发应用,使用JNI的方法来使用NDK本地方法提供的API。这样的好处就是我们可以很好的利用的Android的framework提供的框架,但是需要编写本地具体实现的代码。这样的APK可以在Android 1.5及其之后的版本上面运行。
2 写一个本地的Activity,在本地代码中实现生命回调函数,AndroidSDk提供了
类,这个类可以方便的让你在你的本地代码中实现回调函数(OnCreate,OnPause),从而当这些事件发生的时候处理。
Ⅳ AndroidStudio如何配置NDK/JNIAndroidStudio怎么调用so动态链接库
AndroidStudio怎么调用so动态链接库?在我们日常开发中,经常会用到一些复杂的加密的算法以保证通信的安全。通常这些算法会用C或C++实现后打包成.so动态链接库并向Java层开发接口方便调用。
以AndroidStudio为例
1 . 首先去下载NDK包,下载路径如下可根据自己系统定点下载
https://developer.android.google.cn/ndk/downloads/index.html
static{
System.loadLibrary("jnitext");
}
publicnativeStringget_1111CLang_1String();
Ⅵ android ndk与sdk
1. SDK
Android SDK(Android Software Development Kit),即Android软件开发工具包,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第三方应用都必须使用Java语言。但这并不等同于“第三方应用只能使用Java”,也就是说我们还可以采用C/C++语言。
2. NDK
NDK即Native Development Kit,众所周知,Android程序运行在Dalvik虚拟机中,NDK允许用户使用类似C / C++之类的原生代码语言执行部分程序。
NDK是一系列工具的集合。它提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk(AndroidPackage的缩写,Android安装包)。这些工具对开发者的帮助是巨大的。它集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。它可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作
NDK提供了一份稳定、功能有限的API头文件声明,Google明确声明该API是稳定的,在后续所有版本中都稳定支持当前发布的API。从该版本的NDK中看出,这些API支持的功能非常有限,包含有:C标准库(libc)、标准数学库(libm)、压缩库(libz)、Log库(liblog)。
为什么使用NDK
(1) 代码的保护。由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。
(2) 可以方便地使用现存的开源库。大部分现存的开源库都是用C/C++代码编写的。
(3) 提高程序的执行效率。将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。
(4)便于移植。用C/C++写得库可以方便在其他的嵌入式平台上再次使用。
Ⅶ android开发,怎么使用ndk编译成.so文件
一、首先下载android-ndk,官方网站是:http://developer.android.com/tools/sdk/ndk/index.html
目前最新的版本是android-ndk-r8e-windows-x86.zip,下载地址:
http://dl.google.com/android/ndk/android-ndk-r8e-windows-x86.zip
下载后把压缩包解压出来,例如:D:\ndk,目录下的ndk-build.cmd就是用来编译的批处理命令。
二、编译,打开cmd命令行窗口,cd进入目录:D:\ndk\samples\hello-jni,
然后执行命令:D:\ndk\ndk-build.cmd(如果设置过环境变量则直接使用ndk-build.cmd)来编译hello-jni,如果没有错误会输出:
Gdbserver : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver
Gdbsetup : libs/armeabi/gdb.setup
"Compile thumb : hello-jni <= hello-jni.c
SharedLibrary : libhello-jni.so
Install : libhello-jni.so => libs/armeabi/libhello-jni.so
三、创建android应用程序并使用so文件
打开eclipse创建一个android应用程序HelloJni,默认的com.example.hellojni包下面有一个MainActivity.java,
在此包下添加一个HelloJni.java,
Ⅷ android ndk开发 如何实现一个so包含另一个so
不推荐在jni库之外用so,因为这种情况下,需要在java代码里面依次加载相关的so。
如果一定要用的话android.mk里面的内容如下:
LOCAL_PATH:= $(call my-dir)
# first so, which will be built shared
include $(CLEAR_VARS)
LOCAL_MODULE := shared1
LOCAL_SRC_FILES := libnshared1.so
include $(PREBUILT_SHARED_LIBRARY)
# second so, which will be built shared
include $(CLEAR_VARS)
LOCAL_MODULE := shared2
LOCAL_SRC_FILES := libnshared2.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := yourjni
LOCAL_SRC_FILES := xxxx.cpp
LOCAL_SHARED_LIBRARIES := shared1
LOCAL_SHARED_LIBRARIES := shared2
LOCAL_LDLIBS := -llog
#LOCAL_LDFLAGS = $(LOCAL_PATH)/obj/libstdc++.a
#LOCAL_CPPFLAGS += -lstdc++
include $(BUILD_SHARED_LIBRARY)
Ⅸ NDK开发的so文件到底能为应用程序做什么事
下载后把压缩包解压出来,例如:D:\ndk,目录下的ndk-build.cmd就是用来编译的批处理命令。
二、编译,打开cmd命令行窗口,cd进入目录:D:\ndk\samples\hello-jni,
然后执行命令:D:\ndk\ndk-build.cmd(如果设置过环境变量则直接使用ndk-build.cmd)来编译hello-jni,如果没有错误会输出:
Gdbserver : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver
Gdbsetup : libs/armeabi/gdb.setup
"Compile thumb : hello-jni <= hello-jni.c
SharedLibrary : libhello-jni.so
Install : libhello-jni.so => libs/armeabi/libhello-jni.so
三、创建android应用程序并使用so文件
打开eclipse创建一个android应用程序HelloJni,默认的com.example.hellojni包下面有一个MainActivity.java,
在此包下添加一个HelloJni.java,