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

            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
原创粉丝点击