久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

JNI_Android項(xiàng)目中調(diào)用.so動(dòng)態(tài)庫(kù)

 wusiqi111 2015-11-30
JNI_Android項(xiàng)目中調(diào)用.so動(dòng)態(tài)庫(kù)

2014年6月3日 JNI學(xué)習(xí)

 

上一篇筆者介紹了如何使用Java代碼調(diào)用DLL動(dòng)態(tài)庫(kù)中的C/C++方法,,似乎已經(jīng)是很久以前的做法了,,遇到的錯(cuò)誤筆者還未找到解決方案,但動(dòng)態(tài)庫(kù)著實(shí)是找到的,,只是無(wú)法調(diào)用相應(yīng)的方法。本篇博客來(lái)介紹一下如何在Android項(xiàng)目當(dāng)中使用NDK生成.so動(dòng)態(tài)鏈接庫(kù),,并在程序中使用,。

1. 在Eclipse中創(chuàng)建項(xiàng)目:TestJNI


2. 新創(chuàng)建一個(gè)class:TestJNI.java
  1. package com.wwj.jni;  
  2.   
  3. public class TestJNI {  
  4.     public native boolean Init();  
  5.     public native int Add(int x, int y);  
  6.     public native void Destory();  
  7. }  

以上代碼聲明三個(gè)本地方法。

3. 編譯JNI
找到Android項(xiàng)目中bin目錄下,,會(huì)有classes文件夾,,Eclipse自動(dòng)為我們生成的字節(jié)碼文件就在這個(gè)目錄下。
我們?cè)谠撀窂较?,使用javah命令,,生成我們想要得到的.h頭文件,,如下圖所示:


執(zhí)行javah -jni com.wwj.jni.TestJNI命令之后,會(huì)在classes目錄下生成頭文件:com_wwj_jni_TestJNI.h
將它復(fù)制到j(luò)ni文件夾下,,打開(kāi)如下:
  1. /* DO NOT EDIT THIS FILE - it is machine generated */  
  2. #include <jni.h>  
  3. /* Header for class com_wwj_jni_TestJNI */  
  4.   
  5. #ifndef _Included_com_wwj_jni_TestJNI  
  6. #define _Included_com_wwj_jni_TestJNI  
  7. #ifdef __cplusplus  
  8. extern "C" {  
  9. #endif  
  10. /* 
  11.  * Class:     com_wwj_jni_TestJNI 
  12.  * Method:    Init 
  13.  * Signature: ()Z 
  14.  */  
  15. JNIEXPORT jboolean JNICALL Java_com_wwj_jni_TestJNI_Init  
  16.   (JNIEnv *, jobject);  
  17.   
  18. /* 
  19.  * Class:     com_wwj_jni_TestJNI 
  20.  * Method:    Add 
  21.  * Signature: (II)I 
  22.  */  
  23. JNIEXPORT jint JNICALL Java_com_wwj_jni_TestJNI_Add  
  24.   (JNIEnv *, jobject, jint, jint);  
  25.   
  26. /* 
  27.  * Class:     com_wwj_jni_TestJNI 
  28.  * Method:    Destory 
  29.  * Signature: ()V 
  30.  */  
  31. JNIEXPORT void JNICALL Java_com_wwj_jni_TestJNI_Destory  
  32.   (JNIEnv *, jobject);  
  33.   
  34. #ifdef __cplusplus  
  35. }  
  36. #endif  
  37. #endif  

以上代碼就是通過(guò)javah命令生成jni層代碼,。

4. 使用C/C++實(shí)現(xiàn)JNI
在jni文件夾下,創(chuàng)建com_wwj_jni_TestJNI.h對(duì)應(yīng)的cpp文件:com_wwj_jni_TestJNI.cpp

我們?cè)偬砑觾蓚€(gè)文件Add.h,Add.cpp,,具體實(shí)現(xiàn)放在這兩個(gè)文件中來(lái)完成,。
Add.h
  1. #ifndef _TEST_JNI_ADD_H_  
  2. #define _TEST_JNI_ADD_H_  
  3.   
  4. class CAdd {  
  5. public:  
  6.     CAdd();  
  7.     ~CAdd();  
  8.   
  9.     int Add(int x, int y);  
  10. };  
  11.   
  12. #endif  


Add.cpp
  1. #include "Add.h"  
  2.   
  3. CAdd::CAdd() {  
  4.   
  5. }  
  6.   
  7. CAdd::~CAdd() {  
  8.   
  9. }  
  10.   
  11. int CAdd::Add(int x, int y) {  
  12.     return x + y;  
  13. }  


com_wwj_jni_TestJNI.cpp的實(shí)現(xiàn):
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include "com_wwj_jni_TestJNI.h"  
  4. #include "Add.h"  
  5.   
  6. CAdd *pCAdd = NULL;  
  7.   
  8. JNIEXPORT jboolean JNICALL Java_com_wwj_jni_TestJNI_Init(JNIEnv *env,  
  9.         jobject obj) {  
  10.     if (pCAdd == NULL) {  
  11.         pCAdd = new CAdd;  
  12.     }  
  13.     return pCAdd != NULL;  
  14. }  
  15.   
  16. JNIEXPORT jint JNICALL Java_com_wwj_jni_TestJNI_Add(JNIEnv *env, jobject obj,  
  17.         jint x, jint y) {  
  18.     int res = -1;  
  19.     if (pCAdd != NULL) {  
  20.         res = pCAdd->Add(x, y);  
  21.     }  
  22.     return res;  
  23. }  
  24.   
  25. JNIEXPORT void JNICALL Java_com_wwj_jni_TestJNI_Destory(JNIEnv *env, jobject obj)  
  26. {  
  27.     if (pCAdd != NULL)  
  28.     {  
  29.         pCAdd = NULL;  
  30.     }  
  31. }  


5. 創(chuàng)建mk文件,并使用ndk-build命令生成.so動(dòng)態(tài)鏈接庫(kù)文件
在jni目錄下創(chuàng)建Android.mk文件如下:
  1. LOCAL_PATH := $(call my-dir)  
  2. include $(CLEAR_VARS)  
  3.   
  4. LOCAL_MODULE := TestJNI  
  5.   
  6. LOCAL_SRC_FILES := com_wwj_jni_TestJNI.cpp  
  7. LOCAL_SRC_FILES += Add.cpp  
  8.   
  9. include $(BUILD_SHARED_LIBRARY)  

其中LOCAL_PATH是C/C++代碼所在目錄,,也就是我們的jni目錄,。
LOCAL_MODULE是要編譯的庫(kù)的名稱。編譯器會(huì)自動(dòng)在前面加上lib,,在后面加上.so,。
LOCAL_SRC_FILES是要編譯的C/C++文件。

然后我還需要在Android項(xiàng)目根目錄下創(chuàng)建Application.mk文件:
  1. APP_PROJECT_PATH := $(call my-dir)  
  2. APP_MODULES := TestJNI  

寫(xiě)完了這兩個(gè)mk文件,,我們就可以用ndk來(lái)為我們生成相應(yīng)的動(dòng)態(tài)鏈接庫(kù)了,。前提你需要下載NDK,并把NDK路徑配置到path環(huán)境變量中去,,筆者配置的路徑是:D:\Cocos2dx\android-ndk-r9d,,具體視個(gè)人情況而定。
進(jìn)入Application.mk文件所在目錄,,在命令行中使用ndk-build生成.so文件



編譯成功后會(huì)在工程目錄的libs/armeabi目錄下生成一個(gè)libTestJNI.so文件,。

項(xiàng)目結(jié)構(gòu)會(huì)變成如下:



6. 在Java中調(diào)用JNI
  1. package com.wwj.jni;  
  2.   
  3. import android.os.Bundle;  
  4. import android.widget.TextView;  
  5. import android.app.Activity;  
  6.   
  7. public class TestJNIActivity extends Activity {  
  8.   
  9.     private TextView textView;  
  10.     static {  
  11.         // 加載動(dòng)態(tài)庫(kù)  
  12.         System.loadLibrary("TestJNI");  
  13.     }  
  14.   
  15.     @Override  
  16.     protected void onCreate(Bundle savedInstanceState) {  
  17.         super.onCreate(savedInstanceState);  
  18.         setContentView(R.layout.activity_main);  
  19.         textView = (TextView) findViewById(R.id.textview);  
  20.   
  21.         TestJNI testJNI = new TestJNI();  
  22.         // 調(diào)用native方法  
  23.         boolean init = testJNI.Init();  
  24.         if (init == true) {  
  25.             // 調(diào)用Add函數(shù)  
  26.             int sum = testJNI.Add(100150);  
  27.             textView.setText("你真是個(gè)" + sum);  
  28.         } else {  
  29.             textView.setText("你比二百五還要二百五");  
  30.         }  
  31.         testJNI.Destory();  
  32.     }  
  33. }  



運(yùn)行項(xiàng)目,效果圖如下:




    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買(mǎi)等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多