zoukankan      html  css  js  c++  java
  • 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());进行调用

  • 相关阅读:
    虚拟机调用本机数据库发生错误
    VS2010添加虚拟机发布的WebService引用
    IIS发布错误及解决
    JSON.parse()与JSON.stringify()的区别
    数组去重
    React性能优化 PureComponent
    JS逻辑题 技术点: 1). 变量提升 2). 函数提升 3). 预处理 4). 调用顺序
    React组件间信息传递方式
    css/css3实现未知宽高元素的垂直居中和水平居中
    关于setTimeout的一个逻辑题
  • 原文地址:https://www.cnblogs.com/seliote/p/9312977.html
Copyright © 2011-2022 走看看