最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android studio 下JNI編程實(shí)例并生成so庫(kù)的實(shí)現(xiàn)代碼

 更新時(shí)間:2017年09月14日 22:47:57   作者:Jymoon  
這篇文章主要介紹了Android studio 下JNI編程實(shí)例并生成so庫(kù),需要的朋友可以參考下

最近需要使用JNI編程,學(xué)了下JNI,并且在Android Studio下實(shí)現(xiàn)了一個(gè)小demo。這期間有一些坑,還好都解決了,想分享出來(lái),希望大家少走彎路。本文中采用的平臺(tái)是Windows,NDK環(huán)境已經(jīng)搭建好,這方面資料很多,大家可以自行百度。

本文分為兩個(gè)部分:

1.如何通過(guò)編寫Jni實(shí)現(xiàn)native方法的調(diào)用。

2.怎樣生成.so動(dòng)態(tài)庫(kù)提供給第三方使用。

以下是正文:

一,編寫jni文件,實(shí)現(xiàn)本地方法

1,建立一個(gè)新工程,只有一個(gè)MainActivity,里面加載庫(kù)文件并且調(diào)用若干本地方法,然后通過(guò)Android Studio里的build-makeProject生成class文件。

public class MainActivity extends Activity {
  private final String TAG = "JNITEST"

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    String s=returnString();
    Log.d(TAG,s);
    int a=1000;
    Log.d(TAG,sayhello(a));
  }
  //加載jni
  static {
    System.loadLibrary("nativeTest");
  }
  //聲明native方法
  private native int sayhello(int t);
  private native String returnString();

}

2,生成.h頭文件,里面有Android工程里本地方法的聲明。這個(gè)文件可以自己寫,但是推薦用javah自動(dòng)生成。生成方法為:在控制臺(tái)或者Android studio自帶的控制臺(tái)使用javah命令將上一步make之后生成的class文件生成.h頭文件,這里在用javah的時(shí)候有可能會(huì)出問(wèn)題,比如我第一次就出現(xiàn)了找不到app.activity ,即找不到類文件,這種問(wèn)題一般是沒(méi)有理解javah的用法造成的。我當(dāng)時(shí)采用以下兩種方法:

方法1: cd到 E:\shijue\JniHello\app\src\main

然后輸入 javah -d jni -classpath I:\Andriod\AndroidSDK\platforms\android-15\android.jar;
E:\shijue\JniHello\app\build\intermediates\classes\debug com.example.machenike_pc.jnihello.MainActivity

說(shuō)明:javah是生成頭文件的命令,深綠色為生成文件夾jni,紫紅色為android.jar所在的位置,淺綠色為class文件的路徑+類全名(路徑最后一個(gè)文件夾是debug之后空格+類全名)

(這里補(bǔ)充下-classpath的含義:javah操作是針對(duì)類文件,-bootclasspath和-classpath就是指定在哪里進(jìn)行類文件搜索。JDK搜索類文件先后順序如下:Bootstrap classes,User classes。Bootstrap默認(rèn)的是JDK自帶的jar或zip文件,它包括jre\lib下rt.jar等文件,JDK首先搜索這些文件.可以通過(guò)-bootclasspath來(lái)設(shè)置它。文件之間用分號(hào)";"進(jìn)行分割。User classes搜索順序?yàn)楫?dāng)前目錄、環(huán)境變量 CLASSPATH、-classpath。它們用于告知JDK搜索類文件根目錄名、jar文檔名、zip文檔名,用分號(hào)";"進(jìn)行分隔。)

方法2: cd到E:\shijue\JniHello\app\build\intermediates\classes\debug目錄下,直接javah -d jni com.example.machnike_pc.jnihello.MainActivity 即可

3,在生成的jni目錄下寫一個(gè)c或者c++文件,文件名隨意,實(shí)現(xiàn)本地方法 ,之后需要在該路徑下再加一個(gè)空的cpp或c文件(估計(jì)是軟件的bug,不加的話很可能出ndk錯(cuò)誤),比如我加了個(gè)util.cpp的文件,里面什么都不寫。

下面是我的c++代碼

#include<jni.h>
#include<stdio.h>
#include<com_example_machenike_pc_jnitest2_MainActivity.h>

#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT jint JNICALL Java_com_example_machenike_1pc_jnitest2_MainActivity_sayhello
 (JNIEnv *, jobject, jint);

JNIEXPORT jstring JNICALL Java_com_example_machenike_1pc_jnitest2_MainActivity_returnString
 (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif


JNIEXPORT jint JNICALL Java_com_example_machenike_1pc_jnitest2_MainActivity_sayhello
  (JNIEnv * env, jobject jobj, jint jnumber)
  {
    int modify=jnumber+1;
    return modify;


  }
JNIEXPORT jstring JNICALL Java_com_example_machenike_1pc_jnitest2_MainActivity_returnString
  (JNIEnv *env, jobject jobj)
  {
    return env->NewStringUTF("I'm comes from to Native Function!");
   }

4,如果ndk版本不是最新的,需要在gradle.properties文件下加入:

android.useDeprecatedNdk=true

5,配置ndk路徑,這里也可以在AS的設(shè)置里面配置。我采用的方法是在local.properties文件最后一行加入:

ndk.dir=I\:\\Andriod\\NDK\\android-ndk-r10b

6,build.gradle(app下):文件下加入:(defaultconfig里面)

ndk{
moduleName "nativeTest"
}

此時(shí)運(yùn)行程序已經(jīng)可以實(shí)現(xiàn)本地方法了,之后可以再生成so庫(kù)文件,方便使用。

二,生成.so動(dòng)態(tài)庫(kù)

(這里說(shuō)一下,貌似Android studio已經(jīng)寫好了.mk文件,上面的步驟完成后,直接rebuild一下就自動(dòng)生成為了.so動(dòng)態(tài)庫(kù),下面的方法也能生成,可以看一下,很有用)

1,在jni文件夾下新建Android.mk文件,寫入以下內(nèi)容:

LOCAL_PATH := $(call my-dir)           //固定寫法,把路徑賦給LOCAL_PATH變量
include $(CLEAR_VARS)                  //清除其他LOCAL變量
LOCAL_MODULE := nativeTest             //這個(gè)模塊的名字,最后生成的.so的名字就是它,要跟java里面的loadLibray的名字一樣。
LOCAL_SRC_FILES := nativeTest.cpp\     //這里是要編譯的文件,\ 符號(hào)是換行
            util.cpp
include $(BUILD_SHARED_LIBRARY)        //SHARED_LIBRARY就是動(dòng)態(tài)庫(kù),即.so文件

 這里的寫法是最簡(jiǎn)單的一個(gè)例子,用的時(shí)候把注釋去掉。每一行都是很關(guān)鍵,不能省略。至于makefile怎么編寫內(nèi)容比較多,此處不贅述。

2,在工程根目錄下新建application.make文件,寫入以下內(nèi)容:

APP_PROJECT_PATH := $(call my-dir)
APP_MODULES := nativeTest
3,在命令行下,cd到j(luò)ni目錄(就是之前javah -d jni生成的那個(gè)文件夾)下,輸入指令: ndk-build,等一會(huì)即可生成.so文件。位于lib目錄下,將其放到app/src/main/jniLibs目錄下就能用了。

FAQ:

1,生成的so文件在使用時(shí)需要注意:包名不能變,拿上文舉例,本地方法位于com_example_machenike_pc_jnitest2_MainActivity這個(gè)類下,如果在別的地方用,需要完整的建立這個(gè)包名和類。
2,c和cpp文件均可以用來(lái)寫jni,寫法上略有不同。
3,需要注意java里面成員方法和靜態(tài)方法通過(guò)javah生成的頭文件略有不同,一個(gè)參數(shù)是jclass,另一個(gè)是jobject。
4,不用javah生成頭文件也行,推薦第一次寫的時(shí)候用javah生成,后面修改的時(shí)候(比如參數(shù)改變)可以直接在c文件里手動(dòng)修改。

補(bǔ)充:

SourcePath: D:\work\androidstudio\VisualRecognition\app\src\main\java (絕對(duì)路徑)

TargetPath: D:\work\androidstudio\VisualRecognition\visual\src\main\jni (絕對(duì)路徑)

TargetClassName: com.yf.visualrecognition.UnityPlayerActivity (你的包名+類名)

格式: javah -d ${SourceFile} -classpath ${TargetPath} ${TargetClassName}

生成.h文件:javah -d E:\AndroidProject\GitHubProject\OpenCV\OpenCV\app\src\main\jni -classpath E:\AndroidProject\GitHubProject\OpenCV\OpenCV\app\src\main\java com.cosco.opencv.OpenCVHelper

相關(guān)文章

  • Android自定義ViewGroup打造各種風(fēng)格的SlidingMenu

    Android自定義ViewGroup打造各種風(fēng)格的SlidingMenu

    這篇文章主要介紹了Android自定義ViewGroup打造各種風(fēng)格的SlidingMenu的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • Android?EventBus粘性事件實(shí)現(xiàn)機(jī)制探究

    Android?EventBus粘性事件實(shí)現(xiàn)機(jī)制探究

    最近項(xiàng)目做組件化,需要進(jìn)行組件化的通信,有時(shí)候可能會(huì)出現(xiàn)異步的情況,事件接收方還沒(méi)準(zhǔn)備好事件就已經(jīng)發(fā)送過(guò)來(lái)了,這時(shí)候想到了EventBus的粘性事件,這篇文章主要給大家介紹了關(guān)于Android?EventBus粘性事件實(shí)現(xiàn)機(jī)制的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • Android中BaseActivity自定義標(biāo)題欄

    Android中BaseActivity自定義標(biāo)題欄

    這篇文章主要介紹了Android中BaseActivity自定義標(biāo)題欄,非常實(shí)用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Gradle配置教程之自定義APK名稱與輸出路徑

    Gradle配置教程之自定義APK名稱與輸出路徑

    Gradle是一個(gè)基于JVM的富有突破性構(gòu)建工具,下面這篇文章主要給大家介紹了關(guān)于Gradle配置教程之自定義APK名稱與輸出路徑的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • Android ListView 實(shí)現(xiàn)上拉加載的示例代碼

    Android ListView 實(shí)現(xiàn)上拉加載的示例代碼

    這篇文章主要介紹了Android ListView 實(shí)現(xiàn)上拉加載的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • Android實(shí)現(xiàn)按鈕點(diǎn)擊事件的三種方法總結(jié)

    Android實(shí)現(xiàn)按鈕點(diǎn)擊事件的三種方法總結(jié)

    Button是程序用于和用戶進(jìn)行交互的一個(gè)重要控件。既然有Button,那肯定有onClick方法,下面就教大家三種實(shí)現(xiàn)點(diǎn)擊事件的方法,感興趣的可以了解一下
    2022-04-04
  • Android開發(fā)之AAR文件的生成與使用步驟

    Android開發(fā)之AAR文件的生成與使用步驟

    Android中的aar主要是針對(duì)于Android Library而言的,可以簡(jiǎn)單的理解為是對(duì)Android Library的打包,這個(gè)包的格式為.aar,下面這篇文章主要給大家介紹了關(guān)于Android開發(fā)之AAR文件的生成與使用步驟的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • Android10自動(dòng)連接WiFi問(wèn)題的解決

    Android10自動(dòng)連接WiFi問(wèn)題的解決

    這篇文章主要介紹了Android10自動(dòng)連接WiFi問(wèn)題的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Android實(shí)用的代碼片段 常用代碼總結(jié)

    Android實(shí)用的代碼片段 常用代碼總結(jié)

    這篇文章主要介紹了Android實(shí)用的代碼片段 常用代碼總結(jié),需要的朋友可以參考下
    2014-09-09
  • Android列表實(shí)現(xiàn)單選點(diǎn)擊縮放動(dòng)畫效果

    Android列表實(shí)現(xiàn)單選點(diǎn)擊縮放動(dòng)畫效果

    在android開發(fā),我們會(huì)常常使用到縮放動(dòng)畫,這篇文章主要給大家介紹了關(guān)于Android列表實(shí)現(xiàn)單選點(diǎn)擊縮放動(dòng)畫效果的相關(guān)資料,需要的朋友可以參考下
    2021-08-08

最新評(píng)論

聂荣县| 福清市| 八宿县| 红河县| 瑞昌市| 新龙县| 上饶县| 雷山县| 定襄县| 太仆寺旗| 颍上县| 郓城县| 宁明县| 吴桥县| 哈尔滨市| 深水埗区| 尤溪县| 天长市| 察哈| 庆阳市| 武川县| 怀仁县| 枝江市| 柳林县| 永德县| 邵阳县| 遵义市| 惠安县| 集安市| 吉林省| 普宁市| 武穴市| 特克斯县| 南皮县| 长汀县| 罗城| 蓬莱市| 贵南县| 余江县| 宜君县| 霍林郭勒市|