使用Android Studio的New Project向导,创建一个Android项目。在向导中,注意将Minimum SDK
的值设为至少API 30,因为Thermal的API需要。
运行一下,好,应用成功运行。
在Android Studio的Project面板中,选择Android视图,并点选app
模块,依次选择菜单栏File->Add C++ to Module。完成之后,打开app
模块下自动生成的cpp文件、CMakeLists.txt文件,其中CMakeLists.txt内容如下所示:
cmake_minimum_required(VERSION 3.18.1)
project("myapplication1")
add_library(myapplication1 SHARED myapplication1.cpp)
find_library(log-lib log)
target_link_libraries(myapplication1 ${log-lib})
接下来,打开MainActivity.java,并修改为如下所示:
public class MainActivity extends AppCompatActivity {
static {
System.loadLibrary("myapplication1");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
exec();
}
private native void exec();
}
接下来,为MainActivity.java生成对应的JNI头文件com_hsc_myapplication1_MainActivity.h,并把它放在CMakeLists.txt同级目录下。打开cpp文件,输入内容如下所示:
#include "android/api-level.h"
#include "android/log.h"
#include "android/thermal.h"
#include "com_hsc_myapplication1_MainActivity.h"
extern "C" {
JNIEXPORT void JNICALL Java_com_hsc_myapplication1_MainActivity_exec
(JNIEnv *, jobject) {
const int api = android_get_device_api_level();
if (api >= 30) {
AThermalManager *thermalManager = AThermal_acquireManager();
AThermalStatus status = AThermal_getCurrentThermalStatus(thermalManager);
int iState;
switch (status) {
case ATHERMAL_STATUS_CRITICAL:
iState = 4;
break;
case ATHERMAL_STATUS_EMERGENCY:
iState = 5;
break;
case ATHERMAL_STATUS_ERROR:
iState = -1;
break;
case ATHERMAL_STATUS_LIGHT:
iState = 1;
break;
case ATHERMAL_STATUS_MODERATE:
iState = 2;
break;
case ATHERMAL_STATUS_NONE:
iState = 0;
break;
case ATHERMAL_STATUS_SEVERE:
iState = 3;
break;
case ATHERMAL_STATUS_SHUTDOWN:
iState = 6;
break;
default:
iState = -1;
break;
}
__android_log_print(ANDROID_LOG_DEBUG, "Harry", "%d", iState);
AThermal_releaseManager(thermalManager);
}
}
}
编译一下,报错如下所示:
C/C++: ld: error: undefined symbol: AThermal_acquireManager
C/C++: ld: error: undefined symbol: AThermal_getCurrentThermalStatus
C/C++: ld: error: undefined symbol: AThermal_releaseManager
修改CMakeLists.txt,如下所示:
...
find_library(log-lib log)
find_library(android-lib android)
target_link_libraries(myapplication1 ${log-lib} ${android-lib})
运行一下,得到结果如下所示:
05-17 18:23:59.366 19238 19238 D Harry : 0
其它:
- CMake 3.18.1
- NDK 24.0.8215888