CMake生成多个.so文件
来源:互联网 发布:windows水印在哪里 编辑:程序博客网 时间:2024/06/05 19:19
用CMake来编译生成多个.so文件流程:
1、SDK Manager下载配置好CMake LLDB NDK这个就不需要详细讲了
2、配置完毕后重启一下,然后在app目录下面添加一个CMakeList.txt文件
#CMake的最小版本
cmake_minimum_required(VERSION 3.4.1)
#设置生成的so动态库最后输出的路径,这个下面会讲这么用
#set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})
#生成多个就继续写add_library,仿造下面的去写就ok
add_library( # 生成的.so文件的名称,第一个.so
SHARED
# 提供的c++文件
src/main/cpp/one.cpp )
add_library( # 生成的.so文件的名称,第二个.so
two
# Sets the library as a shared library.
SHARED
# 提供的c++文件
src/main/cpp/two.cpp )
find_library( # Sets the name of the path variable.打印的.so文件
log-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
log )
target_link_libraries( # Specifies the target library.与log库绑定
native-lib
# Links the target library to the log library
# included in the NDK.
${log-lib} )
target_link_libraries( # Specifies the target library.与log库绑定
myself-lib
# Links the target library to the log library
# included in the NDK.
${log-lib} )
3、在app的build.gradle中添加,主要是用来引入CmakeList.txt配置文件
android {
.....
externalNativeBuild {
cmake {
cppFlags ""
}
}
.....
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
}
4、当然你也还需要在local.properties中添加你的ndk位置,有些会自动帮你添加,自己检查一下最好
ndk.dir=G\:\\androidstudioSdkLocation\\ndk-bundle
sdk.dir=G\:\\androidstudioSdkLocation
two.cpp
后续:
1、SDK Manager下载配置好CMake LLDB NDK这个就不需要详细讲了
2、配置完毕后重启一下,然后在app目录下面添加一个CMakeList.txt文件
#CMake的最小版本
cmake_minimum_required(VERSION 3.4.1)
#设置生成的so动态库最后输出的路径,这个下面会讲这么用
#set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})
#生成多个就继续写add_library,仿造下面的去写就ok
add_library( # 生成的.so文件的名称,第一个.so
one
# Sets the library as a shared library.SHARED
# 提供的c++文件
src/main/cpp/one.cpp )
add_library( # 生成的.so文件的名称,第二个.so
two
# Sets the library as a shared library.
SHARED
# 提供的c++文件
src/main/cpp/two.cpp )
find_library( # Sets the name of the path variable.打印的.so文件
log-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
log )
target_link_libraries( # Specifies the target library.与log库绑定
native-lib
# Links the target library to the log library
# included in the NDK.
${log-lib} )
target_link_libraries( # Specifies the target library.与log库绑定
myself-lib
# Links the target library to the log library
# included in the NDK.
${log-lib} )
3、在app的build.gradle中添加,主要是用来引入CmakeList.txt配置文件
android {
.....
externalNativeBuild {
cmake {
cppFlags ""
}
}
.....
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
}
4、当然你也还需要在local.properties中添加你的ndk位置,有些会自动帮你添加,自己检查一下最好
ndk.dir=G\:\\androidstudioSdkLocation\\ndk-bundle
sdk.dir=G\:\\androidstudioSdkLocation
5、以下是我的app的工程目录结构图
(1)新建的cpp文件是用来放我们的c++文件,当然里面定义的方法适合下面的GetString和GetDataFromJni关联起来的。
GetString.java
public class GetString { static { System.loadLibrary("one"); } public static native String getStr();}
GetDataFromJni.java
public class GetDataFromJni { static { System.loadLibrary("two"); } public static native String getData(); public static native int addData(int x,int y); public static native String addString(String string);}one.cpp:
#include <jni.h>#include <string>extern "C" /* * Class: liuqinbin_com_jniproject_GetString * Method: getStr * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_liuqinbin_com_jniproject_GetString_getStr (JNIEnv *env, jclass){ std::string hello = "Hello from C++"; return env->NewStringUTF(hello.c_str()); }
two.cpp
#include <jni.h>#include <string>extern "C"/* * Class: liuqinbin_com_jniproject_GetDataFromJni * Method: getData * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_liuqinbin_com_jniproject_GetDataFromJni_getData (JNIEnv *env, jclass clazz){ std::string hello = "Hello from C++"; return env->NewStringUTF(hello.c_str());}/* * Class: liuqinbin_com_jniproject_GetDataFromJni * Method: addData * Signature: (II)I */JNIEXPORT jint JNICALL Java_liuqinbin_com_jniproject_GetDataFromJni_addData (JNIEnv *evn, jclass clazz, jint x, jint y){ return x+y; }/* * Class: liuqinbin_com_jniproject_GetDataFromJni * Method: addString * Signature: (Ljava/lang/String;)Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_liuqinbin_com_jniproject_GetDataFromJni_addString (JNIEnv *, jclass, jstring string){ return string; }
6、然后make project一下就可以了,之后可以在build下面看我们编译出来的.so文件
7、到这里也差不了我们的工作,之后再你需要的地方调用方法就ok了
public class MainActivity extends AppCompatActivity { private TextView tv; private TextView tv2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv2 = (TextView)findViewById(R.id.tv2); tv = (TextView)findViewById(R.id.tv); tv2.setText(GetString.getStr());//在one.cpp中有对应的方法 tv.setText(GetDataFromJni.getData());//在two.cpp中有对应的方法 }}
后续:
如果你想要在你的app目录下面看到输出的.so文件,这个时候你CmakeList.txt文件只要去掉下面一行代码的#号,这个时候会生成你需要的.so
文件在你的目录下面。
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})
这个时候会生成你的.so,不过你不能去clean project,因为你会让你的工程apk的.so被清除。
这次写有点匆忙,而且没有用MarkDown,下次好好学一下MarkDown.有需要的可以联系wx:liu_qin_bin
阅读全文
1 0
- CMake生成多个.so文件
- Android Studio NDK CMake 指定so输出路径以及生成多个so的案例与总结 # 设置so文件生成路径 # set(CMAKE_LIBRARY_OUTPUT_DIRECTORY $
- Android Studio NDK CMake 指定so输出路径以及生成多个so的案例与总结
- Android Studio NDK CMake 指定so输出路径以及生成多个so的案例与总结
- Android Studio2.2下使用CMake生成so文件
- Android Studio JNI cmake 不能生成.so文件
- Android studio 使用Cmake完成C/C++ 的使用以及生成so文件
- Android studio 使用Cmake完成C/C++ 的使用以及生成so文件
- CMake调用多个C文件
- Android studio如何利用Android.mk编译生成多个so文件
- android 在module内创建CMakeLists.txt来实现生成多个.so文件
- CMake再探:引入SO文件并调用
- androidstudio cmake指定so文件输出目录
- android生成so文件
- android生成so文件
- 生成so文件
- NDK生成so文件
- eclipse生成SO文件
- 合并两个单调递增的链表,使得合并后的链表也是有序
- 1028. 人口普查(20)
- 基于WebStorm, React和Ant.Design开发WebAppDemo
- 关于Spring的注解@Resource的问题
- get set 注解 以及public属性 依赖注入该怎么写
- CMake生成多个.so文件
- 机器学习(1)监督学习和无监督学习
- 通过cglib实现动态代理
- MIT18.06线性代数课程笔记1:矩阵和向量相乘的三种解释
- redis 五种数据类型的使用场景
- 从删服务器到恢复
- PIVOT 行列相转
- UVa 108|Maximum Sum|动态规划
- linux -unrar解压缩