android 加载三方so的方法_Android studio调用第三方so文件

踩了很多坑,走了很长的路,网上各种各样的说法把我整得晕头转向,最终还是成功了,这里自己总结一下,也顺便分享给有需要的伙伴。

如何利用ndk编译我这里就不说了。在linux中进行ndk编译:https://blog.csdn.net/FZeroTHero/article/details/89308312

在Android studio中ndk编译:https://blog.csdn.net/FZeroTHero/article/details/89286139 (再开始下面的阅读之前最好先看看这一篇)

我编译的是 libtestC.so

//testC.h

#ifndef TESTC_H

#define TESTC_H

int testC();

#endif

1

2

3

4

5

//testC.cpp

#include "testC.h"

int testC(){

return 6;

}

1

2

3

4

5

//Android.mk

//my-dir宏返回Android.mk所在位置 即将LOCAL_PATH赋值

LOCAL_PATH:=$(call my-dir)

//清理LOCAL_XXX变量的值

include $(CLEAR_VARS)

//模块名字

LOCAL_MODULE :=testC

//打包给模块的C/C++源码 头文件不用列出 此源文件可以用具体路径表示

LOCAL_SRC_FILES:=testC.cpp

//编译输出 STATIC为静态库 SHARED为动态库 BUILD_EXECUTABLE为可执行程序

include $(BUILD_SHARED_LIBRARY)

1

2

3

4

5

6

7

8

9

10

11

如何嵌入第三方so

1、新建一个工程,不要include c++ support。

2、在app/src/main目录下建一个jni目录,直接右击app,new一个JNI Folder,然后在jni目录下创建preBuild目录(Directory),将自己编译成功的so文件复制到preBuild目录下,然后在preBuild目录下创建include目录,将该so文件引用到的头文件拷贝到include文件中。

3、先配置jni/preBuild 下的Android.mk 和 Application.mk 文件。

#app/src/main/jni/preBuild/Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := testC

LOCAL_SRC_FILES := libtestC.so

include $(PREBUILT_SHARED_LIBRARY)

1

2

3

4

5

6

7

8

9

10

#app/src/main/jni/preBuild/Application.mk

APP_ABI := armeabi-v7a

1

2

3

我这里的so文件是在64位linux中编译出来的,用file命令查看它的属性如下,由于不是很懂cpu架构,这里我选了用得最多的armeabi-v7a 架构。

aaa@aaa:~/Code/test/android-6.0.1_r1/out/target/product/generic/system/lib$ file libtestC.so

libtestC.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /system/, BuildID[md5/uuid]=429997047a14e7df6090ba3374c0b508, stripped

1

2

4、接下来我们创建一个java class,并声明一个native函数, 然后用javah命令在jni目录下生成对应JNI.h。

//com/example/ns/helloso/jniUtils.java

package com.example.ns.helloso;

public class jniUtils {

static {

System.loadLibrary("HelloSo");

}

public native static String sayHello();

}

1

2

3

4

5

6

7

8

9

10

11

我的external tools,javah 和下面要用到的ndk-build设置在上面的链接里面有讲

5、编写对应JNI.h的cpp文件,以及jni/Android.mk,jni/Application.mk

//app/src/main/jni/com_example_ns_helloso_jniUtils.h

/* DO NOT EDIT THIS FILE - it is machine generated */

#include

/* Header for class com_example_ns_helloso_jniUtils */

#ifndef _Included_com_example_ns_helloso_jniUtils

#define _Included_com_example_ns_helloso_jniUtils

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class:     com_example_ns_helloso_jniUtils

* Method:    sayHello

* Signature: ()Ljava/lang/String;

*/

JNIEXPORT jstring JNICALL Java_com_example_ns_helloso_jniUtils_sayHello

(JNIEnv *, jclass);

#ifdef __cplusplus

}

#endif

#endif

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

//app/src/main/jni/com_example_ns_helloso_jniUtils.cpp

#include "com_example_ns_helloso_jniUtils.h"

#include

#include

#include "testC.h"

#include

#define LOG_TAG "lzd"

#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)

//extern "C" JNIEXPORT

jstring JNICALL Java_com_example_ns_helloso_jniUtils_sayHello

(JNIEnv *env, jclass jclass){

int a=testC();

LOGI("sayHello %d", a);

return env->NewStringUTF("成功调用linux下的So");

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

//app/src/main/jni/Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_C_INCLUDES := $(LOCAL_PATH)/preBuild/include

LOCAL_LDLIBS := -llog

LOCAL_SHARED_LIBRARIES := testC

LOCAL_MODULE := HelloSo

LOCAL_SRC_FILES := com_example_ns_helloso_jniUtils.cpp

include $(BUILD_SHARED_LIBRARY)

include $(LOCAL_PATH)/preBuild/Android.mk

#include $(call all-makefiles-under,$(LOCAL_PATH))

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

//app/src/main/jni/Application.mk

APP_STL := c++_static #不加会报错(fatal error: 'iostream' file not found)

APP_ABI := armeabi-v7a

APP_PLATFORM := android-16

1

2

3

4

5

6、在app/build.gradle中指定libs的位置,添加红框中的代码。

sourceSets{

main(){

jniLibs.srcDirs = ['src/main/jniLibs']

jni.srcDirs = []

}

}

}

1

2

3

4

5

6

7

7、在gradle.properties中添加下面一行代码

android.useDeprecatedNdk=true

1

8、ndk-buld,生成so文件。

编译成功就算是成功嵌入了第三方so

9、在MainActivity.java中调用

这样就算成功在AS中调用了我在linux中编译的so文件了。

————————————————

版权声明:本文为CSDN博主「SuperNS」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/fzerothero/article/details/89403078

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值