欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

编译生成.so文件

程序员文章站 2022-03-11 18:55:22
1.新建带c++支持的Android工程。demo编译运行无误2.在CMakeLists.txt中添加,生成.so文件可以拷贝出去供其他工程使用# For more information about using CMake with Android Studio, read the# documentation: https://d.android.com/studio/projects/add-native-code.html# Sets the minimum version of C...

1.新建带c++支持的Android工程。demo编译运行无误

2.在CMakeLists.txt中添加,生成.so文件可以拷贝出去供其他工程使用

# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html

# Sets the minimum version of CMake required to build the native library.

cmake_minimum_required(VERSION 3.4.1)

# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.
#设置生成的so动态库最后输出的路径
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})

#在add_library之前设置
add_library( # Sets the name of the library.
             native-lib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             native-lib.cpp )

3.动态注册native方法名称,这样可以注册其他工程的包路径

// native方法
static jstring JNICALL native_get_String(JNIEnv *env, jobject obj, jobject content) {

}

/**
 * 注册的native调用的方法
 */
static const JNINativeMethod gMethods[] = {
        {"stringFromJNI",  "(Landroid/content/Context;)Ljava/lang/String;", (jstring *) native_get_String}
};

/**
 * 注册方法到JVM中
 * System.loadLibrary会自动调用JNI_OnLoad,在此进行动态注册
 *
 * @param jvm
 * @param reserved
 * @return
 */
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) {
    // 防止动态调试
    ptrace(PTRACE_TRACEME, 0, 0, 0);

    JNIEnv *env = NULL;//注册时在JNIEnv中实现的,所以必须首先获取它
    jint result = JNI_FALSE;

    //获取env指针
    if (jvm->GetEnv((void **) &env, JNI_VERSION_1_6) != JNI_OK) {//从JavaVM获取JNIEnv,使用1.6的版本
        return result;
    }

    //获取类引用,写类的全路径(包名+类名)
    jclass clazz = env->FindClass("com.mobile.encrypt.api.whitebox.EncryptUtils");
    if (clazz == NULL) {
        return result;
    }

    //注册方法
    if (env->RegisterNatives(clazz, gMethods, sizeof(gMethods) / sizeof(gMethods[0])) < 0) {
        return result;
    }
    //成功
    result = JNI_VERSION_1_6;
    return result;
}

4.获取方法签名,在build的 /build/intermediates/classes/debug/目录下获取定义native方法名称工具类的class文件。使用javap -s  xxx.class获取方法签名

5.CMakeLists.txt添加多c++源文件

6.gradle配置

 

 

 

本文地址:https://blog.csdn.net/MatrixMind/article/details/107990181

相关标签: C++ 总结