Android 创建 SO 文件

创建工程,新建一个类,该类需要有一个static初始化块中调用System.loadLibrary("${soName}"),还需要有用native修饰的方法声明(无需实现),一个例子:

package club.seliote.sodemo;
 
public class MyJni {
 
    static {
        // MySo是so库的名字
        System.loadLibrary("MySo");
    }
 
    public native static String getString();
 
}

Build -> Make Project即可在Projectappuildintermediatesclassesdebug${packageName}${className}.class找到class文件
在Project/app/src/main上右键,新建一个JNI文件夹
打开AS的Terminal,路径切换至project/app/src/main/java下,执行javah -jni -classpath ${buildClassesDubugDir} ${packageName}.${className},比如javah -jni -classpath E:CodeAndroidSoDemoappuildintermediatesclassesdebug club.seliote.sodemo.MyJni,这将会在jni文件夹下生成.h文件
在jni文件夹下创建一个C/CPP文件,名称随意,这里用的main,然后在其中实现.h文件中要求的方法(可以直接将.h文件内容复制过来然后修改,还需要注意这里C与CPP的语法是不同的),一个例子:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>;
/* Header for class club_seliote_sodemo_MyJni */
 
#ifndef _Included_club_seliote_sodemo_MyJni
#define _Included_club_seliote_sodemo_MyJni
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     club_seliote_sodemo_MyJni
 * Method:    getString
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_club_seliote_sodemo_MyJni_getString(JNIEnv *env, jclass jobj) {
    return env->NewStringUTF("Hello jni world!");
  }
 
#ifdef __cplusplus
}
#endif
#endif

jni文件夹下新建Android.mk文件,内容是:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
 
LOCAL_MODULE := ${libraryName}
LOCAL_SRC_FILES := ${cppFileName}
include $(BUILD_SHARED_LIBRARY)

一个例子:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
 
LOCAL_MODULE := MySo
LOCAL_SRC_FILES := main.cpp
include $(BUILD_SHARED_LIBRARY)

jni文件夹下新建Application.mk,内容是APP_ABI := all
在Project Structure中配置NDK Path,之后在Terminal中切换至jni文件夹执行C:/Android/Ndk/ndk-build.cmd,即可生成so文件(app/src/main下的libs与obj文件夹内容)
在app/build.gradle的android节点中加入:

sourceSets {
    main() {
        jniLibs.srcDirs = ['src/main/libs']
        jni.srcDirs = []
    }
}

在Java代码中使用类似于((TextView)this.findViewById(R.id.text_view)).setText(MyJni.getString());进行调用

原文地址:https://www.cnblogs.com/seliote/p/9312977.html