android ndk 在project中加入引入dll,在NDK开发中引入第三方库(AndroidStudio Cmake)

原文:http://blog.csdn.net/mxw3755/article/details/56676923

官方:https://developer.android.com/studio/projects/add-native-code.html#specify-abi

在NDK中可能需要复用之前已经编译好的so文件,所以本章的目标是给一个之前编译好的so文件外加一个需要调用接口的头文件,在现在项目中复用。

在本次实践过程中,已经有编译完成的各种cpu架构的libstringutil-lib.so以及头文件,Stringutil.h

0818b9ca8b590ca3270a3433284dd417.png

头文件中简单定义了两个接口:

class StringUtil {

public:

static char* toLower(char* chars);

static char* toUpper(char* chars);

};

顾名思义上述接口已在libstringutil-lib.so中实现

现有工程需要调用这些接口,步骤如下:

1、在java层创建native接口

packagedev.mars.jnidemo;public classStringUtils {

static{

System.loadLibrary("native-lib");}

public static nativeString toLower(String str);public static nativeString toUpper(String str);}

0818b9ca8b590ca3270a3433284dd417.png

2、由Android Studio自动生成native层接口定义,native-lib是实现接口的cpp文件:

extern"C"{

JNIEXPORTjstringJNICALLJava_dev_mars_jnidemo_StringUtils_toLower(JNIEnv*env,jclasstype,jstringstr_) {

const char*str = env->GetStringUTFChars(str_,0);char* str2 =new char[strlen(str)];strcpy(str2,str);StringUtil::toLower(str2);returnenv->NewStringUTF(str2);}

JNIEXPORTjstringJNICALLJava_dev_mars_jnidemo_StringUtils_toUpper(JNIEnv*env,jclasstype,jstringstr_) {

const char*str = env->GetStringUTFChars(str_,0);char* str2 =new char[strlen(str)];strcpy(str2,str);StringUtil::toUpper(str2);returnenv->NewStringUTF(str2);}

}

0818b9ca8b590ca3270a3433284dd417.png

此时编译器应该找不到StringUtil的定义,因此需要将Stringutil.h拷贝到cpp文件所在的文件夹下,本工程中如图所示,新建一个include文件夹,将头文件拷贝过去:

0818b9ca8b590ca3270a3433284dd417.png

然后在native-lib.cpp中加入头文件的引用:

0818b9ca8b590ca3270a3433284dd417.png

#include#include#include"include/StringUtil.h"

0818b9ca8b590ca3270a3433284dd417.png

3、将所有so文件拷贝到工程的libs/jni目录下

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

4、修改app下的gradle文件,在android{}中加入如下代码,将so文件作为引用

sourceSets {

main {

jniLibs.srcDirs= ['./libs/jni']

}

}

0818b9ca8b590ca3270a3433284dd417.png

5、下面是最为关键的CmakeLists.txt的配置

cmake_minimum_required(VERSION 3.4.1)

#定义变量ProjectRoot为工程根目录,用相对路径没通过编译,可能是路径写错,以后再试

#本次使用绝对路径作为参数

set(ProjectRoot G:/AndroidStudioProjects/JNIDemo)

#将native-lib加入到编译源中

add_library( native-lib SHARED src/main/jni/native-lib.cpp )

#动态方式加载 stringutil-lib是libxxxx.so的xxxx部分

add_library(stringutil-lib SHARED IMPORTED)

#设置要连接的so的相对路径,${ANDROID_ABI}表示so文件的ABI类型的路径,这一步引入了动态加入编译的so

set_target_properties(stringutil-lib PROPERTIES IMPORTED_LOCATION ${ProjectRoot}/app/libs/jni/${ANDROID_ABI}/libstringutil-lib.so)

find_library( log-lib log )

#配置加载native依赖

#include_directories( ${ProjectRoot}/app/src/main/jni/include )

#这里多出了引用的stringutil-lib

target_link_libraries(

native-lib

stringutil-lib

${log-lib} )

0818b9ca8b590ca3270a3433284dd417.png

6、测试代码

总结

最为关键的两个步骤

1、在gradlle中指定本地的jni相对路径

2、在CmakeLists.txt中指定加入编译的so及其绝对路径

#动态方式加载 stringutil-lib是libxxxx.so的xxxx部分

add_library(stringutil-lib SHARED IMPORTED)

#设置要连接的so的相对路径,${ANDROID_ABI}表示so文件的ABI类型的路径,这一步引入了动态加入编译的so

set_target_properties(stringutil-lib PROPERTIES IMPORTED_LOCATION ${ProjectRoot}/app/libs/jni/${ANDROID_ABI}/libstringutil-lib.so)

#这里多出了引用的stringutil-lib

target_link_libraries(

native-lib

stringutil-lib

${log-lib} )

由于时间不多,未调试出在CmakeLists.txt 中使用相对路径的办法,我在编译中总是报找不到so的错误。有任何问题欢迎交流。

参考:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值