JNI初級:android studio生成so文件詳細過程

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

 下面是本人結合blog生成so包過程當中遇到一些問題和解決方法android


(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文件 macos

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

   方法一:app

    進入src/main/java文件夾 
  函數

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

 


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

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

 

    而後把java包裏面的jni包拖到main包裏面不然在app\build\intermediates生成不了ndk這個包ui

  方法二:spa

 進入src/main文件夾 .net

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

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

相關文章
相關標籤/搜索