2023-06-16 Android Studio 使用CMakeList编译JNI ,最简单的demo源码

一、代码结构图,代码路径https://download.csdn.net/download/qq_37858386/87913001

 二、cmakedemo\app\build.gradle 加下面的代码

    externalNativeBuild {
            cmake {
                cppFlags "-frtti -fexceptions"
            }
        }

    externalNativeBuild {
        cmake {
            path 'src/main/jni/CMakeLists.txt'
        }
    }

三、使用loadLibrary加载so 库。

package com.hypernano.cmakedemo;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    String TAG = "CMAKE_DEMO";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ((TextView)findViewById(R.id.hint)).setText(GetStringFromJNI(8956));
    }
    static {
        System.loadLibrary("cmakedemo-native-jni");
    }

    public static native String GetStringFromJNI(int number);
}

四、jni 下的CMakeLists.txt 文件,这个文件就是用来指导如何编译。

cmake_minimum_required(VERSION 3.6)

set(target cmakedemo-native-jni)
project(${target} CXX)

#message(STATUS "ANDROID_ABI=${ANDROID_ABI}")
#set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/app/src/main/libs/${ANDROID_ABI})

file(GLOB srcs *.cpp *.c)
file(GLOB hdrs *.hpp *.h)

include_directories("${CMAKE_CURRENT_LIST_DIR}")
add_library(${target} SHARED ${srcs} ${hdrs})
target_link_libraries(${target})

五、JniTest.cpp文件


#include 
#include "JniTest.h"

extern "C"{

JNIEXPORT jstring JNICALL Java_com_hypernano_cmakedemo_MainActivity_GetStringFromJNI
         (JNIEnv *env, jclass clazz ,jint number) {
    // TODO: implement stringFromJNI()
    jstring result;
    jstring str_data;
    char str[20];
    sprintf(str, "%d",number);

    std::string hello = "I am from  cmakedemo jni C++ 202306151710";
    result = env->NewStringUTF(hello.c_str());
    str_data = env->NewStringUTF(str);
    return  result;
 }
}

六、JniTest.h文件

//
// Created by Watson on 2023/6/15.
//
#include 
#ifndef CMAKEDEMO_JNITEST_H
#define CMAKEDEMO_JNITEST_H
#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT jstring JNICALL  Java_com_hypernano_cmakedemo_MainActivity_GetStringFromJNI
(JNIEnv *, jclass ,jint );



#ifdef __cplusplus
}
#endif

#endif //CMAKEDEMO_JNITEST_H

七、build - build APK之后就在build**cmake目录下生成so,点击 analyze就可以看到apk包含so库(下图右边)

九、真机运行结果,可以调用jni的接口了。

2023-06-16 Android Studio 使用CMakeList编译JNI ,最简单的demo源码_第1张图片

 十、参考文章

Android jni开发-1(用CMake编译jni)_android cmake编译jni_ls_star的博客-CSDN博客

Android Studio CMakeList编译JNI_android cpp 编译选择架构_郭家远的博客-CSDN博客

JNI 应用:使用 CMake 编译 生成 so_cmake方式怎么生成jni库_老姚---老姚的博客-CSDN博客

你可能感兴趣的:(android,studio,android,ide)