Android 源码环境下面编译C/C++静态库、动态库、可执行文件
接下来我们通过一个简单的示例程序
1.首先编写一个Java文件: HelloJNI.java
public class HelloJNI {
static {
System.loadLibrary("hello");
}
private native String sayHello();
public static void main(String[] args) {
new HelloJNI().sayHello();
}
}
2.接着生成 C/C++ 头文件 HelloJNI.h 执行命令(需要配置JAVA环境):
javac -h . HelloJNI.java
3.该命令会生成一个 HelloJNI.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloJNI */
#ifndef _Included_HelloJNI
#define _Included_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloJNI
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT jstring JNICALL Java_HelloJNI_sayHello(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
- 实现HelloJNI.c
#include "HelloJNI.h"
#include <stdio.h>
#include <jni.h>
//方法名要和 Java 层包名对应上
JNIEXPORT jstring JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject obj)
{
return (*env)->NewStringUTF(env,"Hello from JNI !");
}
5.编写CMakeList.txt文件
cmake_minimum_required(VERSION 3.0)
project(hello)
include_directories("${PROJECT_SOURCE_DIR}/HelloJNI.h")
#静态库
add_library(${PROJECT_NAME} HelloJNI.c)
#动态库
#add_library(${PROJECT_NAME} SHARED HelloJNI.c)
#可执行文件
#add_executable(${PROJECT_NAME} HelloJNI.c main.cpp)
6.编写build.sh脚本用于编译
cmake -DCMAKE_TOOLCHAIN_FILE=/root/ndk/android-ndk-r20b/build/cmake/android.toolchain.cmake -DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=android-29 -DANDROID_STL=c++_shared -S .
cmake --build .
7.执行chmod +x build.sh,然后./build.sh就可以生成对应的静态库、动态库、可执行文件