当前位置:首页 » 安卓系统 » android调用静态库

android调用静态库

发布时间: 2022-06-26 12:48:26

⑴ 如何在android使用已经有的静态库

关于编译静态库:
android.mk和xxx.cpp放在新文件夹里:
LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \xxx.cpp
LOCAL_MODULE:= libx
include $(BUILD_STATIC_LIBRARY)
生成静态库libx.a文件

关于链接静态库:
有两种方法:
1、把libx.a文件放在android.mk同一目录下,添加:
LOCAL_PREBUILT_LIBS += libx.a
2、同上,添加:
include $(CLEAR_VARS)LOCAL_MODULE := libxLOCAL_SRC_FILES := libx.ainclude $(PREBUILT_STATIC_LIBRARY)LOCAL_STATIC_LIBRARIES += libx
貌似第二种是NDK里比较常见,第一种在其他的android.mk里比较常见。

⑵ 如何在android studio中用JNI调用静态库

NDK中 apps下本身就有一个例子,two-libs,就是引用静态库。LOCAL_PATH:= $(call my-dir)# first lib, which will be built statically#include $(CLEAR_VARS)LOCAL_MODULE := libtwolib-firstLOCAL_SRC_FILES := first.cinclude $(BUILD_STATIC_LIBRARY)# second lib, which will depend on and include the first one#include $(CLEAR_VARS)LOCAL_MODULE := libtwolib-secondLOCAL_SRC_FILES := second.cLOCAL_STATIC_LIBRARIES := libtwolib-firstinclude $(BUILD_SHARED_LIBRARY)

⑶ 如何在android studio中用JNI调用静态库

android ndk开发经常遇到了动态库的问题,本文主要介绍: ① 动态链接库的生成; ② 在java和C混合编程的情况下如何调用第三方动态链接库; ③ 使用dlopen程序运行时直接调用; ④ 纯c的方式开发调用; 本文重点推荐②和④,第③中太麻烦每个函数都需要dlsym调用一次; 代码的网络云链接: pan/s/1dD3qkQ9 密码:c5s3 工具/原料 Win8/article/63f236280b90690208ab3d12/article/c910274bfdd000cd371d2d4b/p/3247530080 2 根据“生成动态库”中的过程1到10,新建一个纯c的ndk程序: “D:\Android\android-ndk-r10\samples\native-activity" 3 把会用的so文件的目录libs拷贝到 jni目录下面 4 修改 Android.mk 文件,内容如下: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := fkAdd LOCAL_SRC_FILES := libs/$(TARGET_ARCH_ABI)/libfkAdd.so include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := main LOCAL_SRC_FILES := main.c LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv1_CM LOCAL_STATIC_LIBRARIES := android_native_app_glue LOCAL_SHARED_LIBRARIES := fkAdd include $(BUILD_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := native-activity LOCAL_SRC_FILES := NativeActivity.c LOCAL_LDLIBS := -llog -landroid LOCAL_STATIC_LIBRARIES := android_native_app_glue include $(BUILD_SHARED_LIBRARY) $(call import-mole,android/native_app_glue) 5 增加 NativeActivity.c 文件,添加内容如下: #include <jni.h> #include <errno.h> #include <dlfcn.h> #include <android_native_app_glue.h> void android_main(struct android_app* state) { // Make sure glue isn't stripped. app_mmy(); void* soAdd = dlopen("/data/data/com.example.native_activity/ lib/libfkAdd.so",RTLD_NOW); void* soMain = dlopen("/data/data/com.example.native_activity/ lib/libmain.so",RTLD_NOW); void (*fp_android_main)(struct android_app*) = (void (*)(struct android_app*))dlsym(soMain,"android_main"); fp_android_main(state); dlclose(soMain); dlclose(soAdd); } 6 在 main.c 文件中添加一行,方便测试: __android_log_print(ANDROID_LOG_DEBUG, "fuke", "engine_handle_input 100 + 200 = [%d] ", fkAdd(100, 200)); 7 编译运行,点击手机屏幕后,观察logcat 效果如下: END 注意事项 c++的函数在写动态链接库的时候,需要注意的是c++的函数会被系统修改,所以做动态库测试的使用最好用c语言

⑷ 如何在android studio中用JNI调用静态库a文件

androidndk开发经常遇到了动态库的问题,本文主要介绍:①动态链接库的生成;②在Java和C混合编程的情况下如何调用第三方动态链接库;③使用dlopen程序运行时直接调用;④纯c的方式开发调用;本文重点推荐②和④,第③中太麻烦每个函数都需要

⑸ 如何在android studio中用JNI调用静态库

android ndk开发经常遇到了动态库的问题,本文主要介绍:
① 动态链接库的生成;
② 在Java和C混合编程的情况下如何调用第三方动态链接库;
③ 使用dlopen程序运行时直接调用;
④ 纯c的方式开发调用;
本文重点推荐②和④,第③中太麻烦每个函数都需要dlsym调用一次;
代码的网络云链接:密码:c5s3
工具/原料
Win8.1 x64
adt-bundle-windows-x86_64-20140702
android-ndk-r10d
生成动态库
1
android ndk下面生成动态库so文件的方法很多,但是这里只提供一种方法,更多的生成方法可以看,“ndk 编译静态库”:
2
fkAdd.c 的内容如下:
#include <jni.h>
int fkAdd(int nX, int nY)
{
return nX + nY;
}
3
Android.mk 的内容如下:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= fkAdd
LOCAL_SRC_FILES:= fkAdd.c
include $(BUILD_SHRRED_LIBRARY)
4
1、打开 eclipse
2、点击 文件
3、点击 新建
4、点击 other...

5
1、展开 Android 选项;
2、选择 Android Project from Existing Code;
3、点击 Next

6
1、输入 Root Director;
2、取消 tests;
3、选中 Copy projects into workspace;
4、点击 Finish;

7
1、右键工程;
2、选择 Android Tools;
3、Add Native Support...;

8
点击 Finish

9
修改android sdk 版本为 4.0.3;
关于如何修改 android sdk 版本:
10
修改 Min SDK version:15
修改 Target SDK version:19

步骤阅读
11
在jni目录下面新建文件fkAdd.c 的内容如下:
int fkAdd(int nX, int nY)
{
return nX + nY;
}

12
临时修改 Android.mk 文件内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#LOCAL_MODULE := hello-jni
#LOCAL_SRC_FILES := hello-jni.c
LOCAL_MODULE := fkaddso
LOCAL_SRC_FILES := fkAdd.c
include $(BUILD_SHARED_LIBRARY)

13
使用快捷键Ctrl+B编译后可以在libs目录下面看到生成的一些列的
libfkaddso.so文件,如下图所示

END
Java和c编程调so
1
1、将libs复制一份到jni目录下面,删掉其中不相关的文件
2、删掉文件 jni/fkadd.c 文件
3、将 Android.mk 文件还原成最开始的样子;

2
修改 hello-jni.c 中的部分代码,如下:
char szMsg[1024] = {0};
int nSum = fkAdd(100, 10);
sprintf (szMsg, "Hello from JNI ! Compiled with ABI " ABI ". %d ", nSum);
return (*env)->NewStringUTF(env, szMsg);

3
修改 Android.mk 文件:
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := fkaddso
LOCAL_SRC_FILES := libs/$(TARGET_ARCH_ABI)/libfkaddso.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
LOCAL_SHARED_LIBRARIES := fkaddso

include $(BUILD_SHARED_LIBRARY)

4
修改 HelloJni.java 在其中增加一行:
System.loadLibrary("fkaddso");

5
运行工程看效果:

END
用dlopen调用so
1
重复“生成动态库”中的过程1到10,
2
把需要调用so文件的目录libs拷贝到jni目录下面,并修改 Android.mk 文件的内容如下:
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := fkaddso
LOCAL_SRC_FILES := libs/$(TARGET_ARCH_ABI)/libfkaddso.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)

3
修改 hello-jni.c 的内容如下:
char* szSo = "/data/data/com.example.hellojni/lib/libfkaddso.so";
void* fkAddSo = dlopen(szSo, RTLD_LAZY);
int (*fpAdd)(int,int) = (int (*)(int,int))dlsym(fkAddSo, "fkAdd");
char szMsg[1024] = {0};
int nSum = fpAdd(100, 200);
dlclose(fkAddSo);
sprintf (szMsg, "%s %d", szSo, nSum);
return (*env)->NewStringUTF(env, szMsg);

4
关于如何获取 so在手机中的路径,可以通过在控制台下输入 adb shell 后,
在手机上查询:

5
编译后运行效果:

6
方便他人亦是方便自己,如果觉得还行就点下下边的投票吧,这样可以帮助其他人更快的找到解决问题的方法;有疑问的也可留言哦, 谢谢!

END
纯c的方式开发调用
1
此方法需要感谢ndk吧的吧友提供哦,本人只是负责将其进行了整理,归纳后发帖,谢谢,原始地址:http://tieba..com/p/3247530080
2
根据“生成动态库”中的过程1到10,新建一个纯c的ndk程序:
“D:\Android\android-ndk-r10\samples\native-activity"

3
把会用的so文件的目录libs拷贝到 jni目录下面

4
修改 Android.mk 文件,内容如下:
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := fkAdd
LOCAL_SRC_FILES := libs/$(TARGET_ARCH_ABI)/libfkAdd.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := main
LOCAL_SRC_FILES := main.c
LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv1_CM
LOCAL_STATIC_LIBRARIES := android_native_app_glue
LOCAL_SHARED_LIBRARIES := fkAdd
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := native-activity
LOCAL_SRC_FILES := NativeActivity.c
LOCAL_LDLIBS := -llog -landroid
LOCAL_STATIC_LIBRARIES := android_native_app_glue
include $(BUILD_SHARED_LIBRARY)

$(call import-mole,android/native_app_glue)

5
增加 NativeActivity.c 文件,添加内容如下:
#include <jni.h>
#include <errno.h>
#include <dlfcn.h>

#include <android_native_app_glue.h>

void android_main(struct android_app* state) {

// Make sure glue isn't stripped.
app_mmy();

void* soAdd = dlopen("/data/data/com.example.native_activity/
lib/libfkAdd.so",RTLD_NOW);
void* soMain = dlopen("/data/data/com.example.native_activity/
lib/libmain.so",RTLD_NOW);

void (*fp_android_main)(struct android_app*) =
(void (*)(struct android_app*))dlsym(soMain,"android_main");

fp_android_main(state);

dlclose(soMain);
dlclose(soAdd);
}

6
在 main.c 文件中添加一行,方便测试:
__android_log_print(ANDROID_LOG_DEBUG, "fuke", "engine_handle_input 100 + 200 = [%d] ", fkAdd(100, 200));

7
编译运行,点击手机屏幕后,观察logcat 效果如下:

END
注意事项
c++的函数在写动态链接库的时候,需要注意的是c++的函数会被系统修改,所以做动态库测试的使用最好用c语言

⑹ 安卓能调用linux的静态库吗

啥处理都不行,如果安卓是x86结构的可以用对应指令集的库,否则只能重新编译,安卓普遍的arm和桌面级Linux不一样,苹果更不可能了,不仅CPU结构,操作系统都不属于一种

⑺ 如何在android studio中用JNI调用静态库

androidstudiondk调用过程如下:通过jniaes案例说明调用NDK层配置过程而我们通过底层来判断签名是否正确,如果正确则继续执行核心代码,否则退出程序,这样就可以防止别人恶意反编译,并进行二次打包。首先去官网下载一个最新的NDK,随便放到哪都行,像我放在D:\Dev\Android\android-ndk-r10d.(1)新建一个项目:名称JniAes首先在java类中添加native接口,注意写好native接口和System.loadLibrary()即可。代码如下:();();(Contextcontext);4然后buildproject得到其中中间文件,我们关注的是.class文件。编译OK以后生成的class文件在AS工程的如下目录:aes\app\build\intermediates\classes\debug\android\(2)接下来跟class文件生成相应的.h头文件,执行如下命令即可点击"View->ToolWindows->Terminal"即在Studio中进行终端命令行工具.执行如下命令生成c语言头文件.javah-djni-classpathc:\Users\sodinochen\AppData\Local\Android\sdk\platforms\android-16\android.jar;..\..\build\intermediates\classes\debugcom.aes.jniaes.MainActivity(3)然后将刚才的.h文件剪切过来。在jni目录下新建一个c文件,随意取名,我的叫strk.c。strk.c文件,用于实现核心代码逻辑,判断包名.哈希值是否合法,如果返回1,为合法。反之,则不合法。入口方法为:jintJava_com_aes_jniaes_MainActivity_jniCheckAPP(JNIEnv*env,jobjectcontext, jobjectthiz)接下来在工程的local.properties文件中添加NDK路径(上面下载好的那个NDK),类似其中的SDK路径一样,我的添加后如下:sdk.dir=D\:\\Dev\\Android\\android-sdk-windowsndk.dir=D\:\\Dev\\Android\\android-ndk-r10d(4)接下来在appmole目录下的build.gradle中设置库文件名(生成的so文件名)。找到gradle文件的defaultConfig这项,在里面添加如下内容:defaultConfig{ applicationId"com.aes.jniaes" minSdkVersion15 targetSdkVersion22 versionCode1 versionName"1.0" ndk{ moleName"checkapp-jni" //生成的so名字 abiFilters"armeabi","armeabi-v7a","x86" //输出指定三种abi体系结构下的so库。目前可有可无。 } }(5)最后就是添加静态初始化loadLibrary代码,添加如下:static{ System.loadLibrary("checkapp-jni"); //so文件的名字 }编译出来的so文件在aes\app\build\intermediates\ndk\debug\lib目录下 那么如何将编译好的so文件进行使用,可以通过如下方式:二. 引用so文件(1).在“src/main”目录中新建名为“jniLibs”的目录;(2).将so文件复制、粘贴到“jniLibs”目录内。

⑻ android 怎么引用一个静态库

由于工作需要,需要在framework中增加自己的动态库,并且动态库需要使用合作方提供的第三方静态库。但是在引入静态库编译动态库时总是提示失败。具体如下:

1. 文件列表

可以看出这个配置文件的内容主要分为两部分,第一部分预编译静态库,这一过程不触发构建过程,仅仅是重起了个名字,并且将该库拷贝到某个路径下(具体可以参看另一篇文章,NDK使用二进制库的方法);第二部分是用于编译动态本地库,可以看出它通过LOCAL_STATIC_LIBRARIES关键字引入了之前预编译的静态库。

⑼ 如何在android studio中用JNI调用静态库

NDK中 apps下本身就有一个例子,two-libs,就是引用静态库。
LOCAL_PATH:= $(call my-dir)

# first lib, which will be built statically
#
include $(CLEAR_VARS)

LOCAL_MODULE := libtwolib-first
LOCAL_SRC_FILES := first.c

include $(BUILD_STATIC_LIBRARY)

# second lib, which will depend on and include the first one
#
include $(CLEAR_VARS)

LOCAL_MODULE := libtwolib-second
LOCAL_SRC_FILES := second.c

LOCAL_STATIC_LIBRARIES := libtwolib-first

include $(BUILD_SHARED_LIBRARY)

热点内容
中国十大解压电影 发布:2025-04-23 06:13:07 浏览:582
产品直播脚本范文例子 发布:2025-04-23 06:10:24 浏览:312
安卓id加密 发布:2025-04-23 06:10:23 浏览:387
python行内if 发布:2025-04-23 06:10:20 浏览:219
ubuntu编译32位程序 发布:2025-04-23 06:10:20 浏览:958
什么在资源配置中起宏观调控作用 发布:2025-04-23 06:05:25 浏览:723
换手机怎么把安卓app移到苹果手机 发布:2025-04-23 06:05:20 浏览:899
java的时间格式 发布:2025-04-23 06:04:39 浏览:975
美团安卓哪里再次配送 发布:2025-04-23 05:56:07 浏览:978
油画价格算法 发布:2025-04-23 05:54:37 浏览:532