Android 源码环境下面编译C/C++静态库、动态库、可执行文件

147 阅读1分钟

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
  1. 实现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就可以生成对应的静态库、动态库、可执行文件

8.[源代码见](study_2_jni_helloworld · 王俊/framework - 码云 - 开源中国)