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());进行调用

  • 相关阅读:
    SpringCloud学习总结(九)——微服务架构高并发问题
    SpringCloud学习总结(八)——服务调用Feign
    SpringCloud学习总结(七)——服务注册中心Consul
    SpringCloud学习总结(六)——服务调用和负载均衡Ribbon
    Hadoop综合大作业
    分布式文件系统HDFS练习
    安装Hadoop
    爬虫综合大作业(震惊!爬取了590位微信好友后竟然发现了)
    爬取全部的校园新闻
    理解爬虫原理
  • 原文地址:https://www.cnblogs.com/seliote/p/9312977.html
Copyright © 2011-2022 走看看