• JNI初级:android studio生成so文件详细过程


    本文主要参考blog:http://blog.csdn.net/jkan2001/article/details/54316375

     下面是本人结合blog生成so包过程中遇到一些问题和解决方法


    (1)新建一个android项目,增加native方法

     1 package update.smartapp.com.myso;
     2 
     3 /**
     4 * Created by qinpeizhou on 17-5-12.
     5 */
     6 
     7 public class JNIUtils {
     8 static {
     9 System.loadLibrary("NativeExample");
    10 }
    11 
    12 public static native String getStringFromNative();
    13 
    14 }

    (2)执行Build->Make Project方法   

    执行完这一步后,我们会在项目的appuildintermediatesclassesdebug路径下发现编译成功的项目class文件

    (3)生成jni包和.h文件

       方法一:

        进入src/main/java文件夹 
      

    1  qinpeizhou@qinpeizhou-PC:~/Documents/AsDemo/MySO$ cd app/src/main/java


       执行命令生成jni包和.h文件
      

      javah -d jni update.smartapp.com.myso.JNIUtils

        然后把java包里面的jni包拖到main包里面否则在appuildintermediates生成不了ndk这个包

      方法二:

     进入src/main文件夹 

      qinpeizhou@qinpeizhou-PC:~/Documents/AsDemo/MySO$ cd app/src/main

       再输入javah -d jni -classpath [你的sdk路径]platformsAndroid-22android.jar;….uildintermediatesclassesdebug [你的包名+包含native方法

      qinpeizhou@qinpeizhou-PC:~/Documents/AsDemo/MySO$ javah -d jni -classpath homeqinpeizhouDocumentsandroid-sdk-macosxplatformsAndroid-22android.jar;....uildintermediatesclasses
    
      debug  com.exmple.root.solo.NativeUtils

      这个生成的jni包是在main下的,强烈建议NDK版本选r9+的最好不用r13版本的,因为r13我用的报错不断~

    (5)实现.h中的方法 

    拷贝自动生成的.h方法,到jni里,并重命名为main.c,并编写main.c中的代码,实现native方法

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

    注意!这里会报错

    1 Error:Execution failed for task ':app:compileDebugNdk'.
    2 > Error: Flag android.useDeprecatedNdk is no longer supported and will be removed in the next version of Android Studio. Please switch to a supported build system.


    这是因为我们没有配置NDK路径的问题


    (5)配置NDK路径等等


    打开Project的local.properties文件添加NDK路径ndk.dir=C:\work\sorfware\android\android-ndk-r10e
    在gradle.properties添加android.useDeprecatedNdk=true
    在app路径的build.gradle 的defaultconfig中添加

    ndk {
    moduleName "NativeExample" //设置库(so)文件名称
    ldLibs "log", "z", "m" //添加系统库
    abiFilters "armeabi", "armeabi-v7a", "x86" //生成3中类的.so文件
    }

     注意:注意在jni包内添加空.c文件或者.c文件的mian函数会报main函数重复问题,main函数重复就把该.c文件的main函数改成main1.c等等

    (6)使用.so文件

         在本项目中使用.so文件,首先在main包下创建jniLibs包把.so文件所在的armeabi,armeabi-v7a,x86包都复制在里面

         调用native方法

         

       

  • 相关阅读:
    黄聪:WordPress动作钩子函数add_action()、do_action()源码解析
    黄聪:使用WORDPRESS自带AJAX方法
    黄聪:get_posts 函数 | wordpress
    黄聪:wordpress伪静态的原理
    黄聪:wordpress如何开启文章格式post format
    黄聪:Xmind修改默认字体风格设置
    黄聪:让WordPress主题支持语言本地化(使用poedit软件实现中文翻译功能)
    ArcGIS Pro二次开发-选择gdb
    arcgis pro2.5 改变地图范围
    创建用户SQL
  • 原文地址:https://www.cnblogs.com/mrszhou/p/6859137.html
Copyright © 2020-2023  润新知