如何去在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 版权协议,转载请附上原文出处链接和本声明。