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