JNI具体测试

大致结构:


image.png

CMakeLists.txt

# 指定 cmake 的最小版本
cmake_minimum_required(VERSION 3.4.1)

# 打印日志

message("当前CMake的路径是:"${CMAKE_SOURCE_DIR})
message("当前 CMAKE_ANDROID_ARCH_ABI 的路径:"${CMAKE_ANDROID_ARCH_ABI})

#设置生成的so动态库最后输出的路径(针对生成so用的,如果调试c++记得注释掉,并且移除项目jniLibs/arm下的so,否则包多so重复异常)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})

message("so输出路径:"${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})

# 批量引入源文件
file(GLOB allCpp *.cpp)

# 加入cpp源文件,SHARED:生成动态库或共享库;STATIC:生成静态库
add_library(native-lib SHARED
            # native-lib.cpp 替换${allCpp} 批量导入文件
           ${allCpp})

# 查找指定库文件,只能找系统的
find_library(log-lib
             log )

message("当前的log路径在哪里>>>>>>> ${log-lib}")

# 设置 target 需要链接的库, 开始链接指定库
target_link_libraries(native-lib
                      ${log-lib} )

app下的build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.0"

    defaultConfig {
        applicationId "com.george.myjni"
        minSdkVersion 21
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        // 调试c++时候解开
//        externalNativeBuild {
//            cmake {
////                cppFlags "" 默认包含四大平台,生产的so种类
//                abiFilters 'armeabi-v7a'
//            }
//        }
        ndk{
            // 过滤,只使用这个版本的库,否则默认的是4个平台,使用so哪几种
            abiFilters 'armeabi-v7a'
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    // 调试c++时候解开
//    externalNativeBuild {
//        cmake {
//            path "src/main/cpp/CMakeLists.txt"// 指定CMakeLists 路径
//            version "3.10.2"
//        }
//    }
}

dependencies {
//    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'

}

c++源码:注意包名

#include 
#include 
#include 
#include 

#define TAG "native-lib"
// __VA_ARGS__ 代表 ...的可变参数
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__);
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__);
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__);


//extern "C" JNIEXPORT void JNICALL
//Java_com_george_myjni_MainActivity_testCmake(
//        JNIEnv *env,
//        jclass /* this */) {
//    std::string hello = "hello from C++";
//    __android_log_print(ANDROID_LOG_DEBUG,"测试","main---->:%d",123);
//}
extern "C" JNIEXPORT jstring JNICALL
Java_com_fcs_jni_FCSJni_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello Word!";
    return env->NewStringUTF(hello.c_str());
}

jni部分:

package com.fcs.jni;
public class FCSJni {
    static {
        System.loadLibrary("native-lib");
    }
    public static native String stringFromJNI();
}

你可能感兴趣的:(JNI具体测试)