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方法   

執行完這一步后,我們會在項目的app\build\intermediates\classes\debug路徑下發現編譯成功的項目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包里面否則在app\build\intermediates生成不了ndk這個包

  方法二:

 進入src/main文件夾 

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

 

   再輸入javah -d jni -classpath [你的sdk路徑]\platforms\Android-22\android.jar;….\build\intermediates\classes\debug [你的包名+包含native方法

  qinpeizhou@qinpeizhou-PC:~/Documents/AsDemo/MySO$ javah -d jni -classpath \home\qinpeizhou\Documents\android-sdk-macosx\platforms\Android-22\android.jar;..\..\build\intermediates\classes

  \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方法

     

   

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM