JNI–初步认识CMake

  • Post author:
  • Post category:其他


如何去在android应用jni我这里就不说明了。

这里主要来记录一些基本操作:

CMakeLists.txt:

add_library:将cpp文件编译成so动态库的语法
find_library:查找so动态库;在安卓系统中去查找,查看安卓种log一个库,把它命名成log-lib
target_link_libraries:作用就是一个so动态库关联的一个语法;比如把native-lib.cpp 编译成native-lib的so文件,那我们需要关联安卓log打印的一个库

在CMake里面注意到:${log-lib}。这个美元符号和一个大括号,这是CMake里面变量的使用

-------------------------------------------------------------------------------------------------------------------
注意的是:如果要进行下面操作,就得在配置文件中切换CMake的版本。因为3.10.2版本不会将信息打印出来。这里我切换为了3.6.0。每次打印都需要将app目录下的.cxx金额build文件删掉,重新运行才能看到打印结果
    CMake使用变量的话,使用的是set(var hello),里面是变量名和变量值。不区分大小写

    message(S{var})相当于log打印,会输出变量的值

    include_directories(people/):将people文件夹下的所有内容放进搜素路径中

    这两个以后都会挺常用的(打印CMake的当前路径和文件夹路径):
    message(${CMAKE_CURRENT_LIST_FILE})
    message(${CMAKE_CURRENT_LIST_DIR})

同时CMake还提供了逻辑操作:
    例如:
        IF(TRUE)
            message("Hello")
        ENDIF()

-------------------------------------------------------------------------------------------------------------------
实践练习:
    1,在cpp文件创建一个文件夹,名为:people,再创建一个cpp类,命名为People
    2,之后我们想法People这个类编译成安卓上的一个动态库
    3,需要的操作:需要CMake里面 add_library 的操作,将我们对应的c++文件编译成库。其中SHARED指的就是编译成动态库,也可以改为STATIC(静态库)
        例如;add_library(
        			//设置so文件的名称
        		   people-lib
                   SHARED
                   //so文件的相对路径
                   people/people.cpp)
    4,用native关联people。在target_link_libraries 加一行people-lib
    5,在.cpp文件中,编写一个函数返回string。在.h文件中创建一个类,写一个方法调用cpp文件的函数,得到string
    6,在native-lib.cpp中创建.h类对象。类对象调用方法获得string显示在屏幕上


实践练习操作:

people.cpp

#include "People.h"

std::string People::getString(){
    return "hello";
}

people.h

class People {
public:
    std::string getString();
};

native-lib.cpp

#include <jni.h>
#include <string>

#include <people.h>//这里是将people文件内容添加进来搜索路径

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_myjnitest_MainActivity_stringFromJNI(JNIEnv* env,jobject /* this */) {
    std::string hello = "Hello from C++";
    People people;
    return env->NewStringUTF(people.getString().c_str());

}

以上是实践练习步骤5,6的代码。

步骤1,2,3代码如下:(自己看着对比和看笔记)

cmake_minimum_required(VERSION 3.4.1)

# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.


set(var hello)
message(${var})

message(${CMAKE_CURRENT_LIST_FILE})
message(${CMAKE_CURRENT_LIST_DIR})

add_library( # Sets the name of the library.
             native-lib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             native-lib.cpp )
add_library(people-lib
        SHARED
        people/people.cpp)

# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.

include_directories(people/)

find_library( # Sets the name of the path variable.
              log-lib

              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )

# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.

target_link_libraries( # Specifies the target library.
                       native-lib
                        people-lib
                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )

之后自己练习熟悉了下,写一下个人写的思路:

1,先创建cpp和h文件(这时候,cpp和h文件并不能添加头文件,没有环境。需要第三步完成后才可以。意思就是要先生成so动态库)
2,在java部分写native方法。这时候就会让你添加jni,可以一键添加,也可也自己写
3,将cpp文件编译成so动态库的语法,也就是写CMake	
4,在h文件内定义方法,在cpp文件里面调用。

JNI返回参数:
	return reinterpret_cast<jstring>(x):用于放回数字
	return env->NewStringUTF(x.c_str()):用于放回字符串

注意的点:

就静态类和CMake里面的add函数,都是最后lib都是依照cpp文件的名字的
也就是说你cpp文件名字为:people.cpp
那么你的static和add里面写的就是people-lib



版权声明:本文为qq_43616001原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。