1. 程式人生 > >Android jni 靜態註冊 和動態註冊

Android jni 靜態註冊 和動態註冊

JNI 開發流程

1.編寫native 方法
2.javah 命令,生成.h 檔案 
  java_類的全名_方法名
   或者自己手寫
  
3.複製.h 標頭檔案到cpp 工程
4.複製jni.h 和jni_md.h
5.實現.h 標頭檔案中的宣告函式
6.生成一個dll 動態庫
7.在java中載入動態庫
8.觸發native函式

靜態註冊: (1)編寫native方法

public class FileUtils {


    public native static  void diff(String path, String pattern_Path, int file_num);


    public native static  String getString();


    public native String getNoStaticString();


    public String key= "key";


    public native String accessField();


    /**
     * 通過 這個方法來觸發,jni 呼叫
     * getRandeomUUId 這個靜態方法
     */
    public native void getStaticString();


    //訪問構造方法
    public native Date acceessConstructor();


    //訪問構造方法
    public native String getStudentName();
    // 中文的處理
    public native String chineseChars(String str);


    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
    }


}
(2)生成.h檔案 #include <jni.h>
/* Header for class com_zack_banner_FileUtils */


#ifndef _Included_com_zack_banner_FileUtils
#define _Included_com_zack_banner_FileUtils
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_zack_banner_FileUtils
 * Method:    diff
 * Signature: (Ljava/lang/String;Ljava/lang/String;I)V
 */
JNIEXPORT void JNICALL Java_com_zack_banner_FileUtils_diff
  (JNIEnv *, jclass, jstring, jstring, jint);


#ifdef __cplusplus
}
#endif
#endif
(3)靜態註冊的c方法 JNIEXPORT void JNICALL Java_com_zack_banner_FileUtils_diff
  (JNIEnv *, jclass, jstring, jstring, jint)
{ } (4)動態註冊

/*,
{
"getString","()Ljava/langString;",(void*)native_java_str
}*/
static  const JNINativeMethod getMethod[]= {
        {
           "diff", "(Ljava/lang/String;Ljava/lang/String;I)V", (void *) native_zack_diff
        }
        ,{
            "getString","()Ljava/lang/String;",(void*)native_java_str
        }
        ,{
             "getNoStaticString","()Ljava/lang/String;",(void*)native_no_static
        },
        {
                "accessField","()Ljava/lang/String;",(void*)change_zack_key
        },
        {
                "chineseChars","(Ljava/lang/String;)Ljava/lang/String;",(void*)getchineseChars
        },
        {
                "acceessConstructor","()Ljava/util/Date;",(void*)zack_getDate
        },
        {
                "getStudentName","()Ljava/lang/String;",(void*)zack_getStudentName
        }
};


static int registerNatives(JNIEnv* engv)
{
    LOGI("registerNatives begin");
    jclass  clazz;
    clazz = (*engv) -> FindClass(engv, "com/zack/banner/FileUtils");


    if (clazz == NULL) {
        LOGI("clazz is null");
        return JNI_FALSE;
    }


    if ((*engv) ->RegisterNatives(engv, clazz, getMethod, NELEM(getMethod)) < 0) {
        LOGI("RegisterNatives error");
        return JNI_FALSE;
    }


    return JNI_TRUE;
}
//JNI_OnLoad
JNIEXPORT jint JNI_OnLoad(JavaVM *vm,void* reserved){
    LOGI("jni_OnLoad begin");


    JNIEnv* env = NULL;
    if ((*vm)->GetEnv(vm,(void**) &env, JNI_VERSION_1_4) != JNI_OK) {
        LOGI("ERROR: GetEnv failed\n");
        return -1;
    }
    assert(env != NULL);
    registerNatives(env);
    return  JNI_VERSION_1_4;
}
(5)觸發 public class MainActivity extends AppCompatActivity {


    private String TAG="zack";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        diff();


        TextView tvTest= (TextView) findViewById(R.id.tv_test);
        FileUtils fileUtils=new FileUtils();
        StringBuffer stb=new StringBuffer();
        stb.append(FileUtils.getString()).append("\n");
        stb.append(fileUtils.getNoStaticString()).append("\n");
        stb.append("change before key: " + fileUtils.key).append("\n");
        fileUtils.accessField();
        stb.append("after change, Key:  " + fileUtils.key).append("\n");
        stb.append(fileUtils.acceessConstructor()).append("\n");
        stb.append(fileUtils.getStudentName());




        tvTest.setText(stb);


        System.out.println(fileUtils.chineseChars("她的背影"));
//        fileUtils.accessField();
//        System.out.println("after change, Key:  " + fileUtils.key);




    }
    public void diff() {


        Log.d(TAG, "diff begin");
        FileUtils.diff("x","s",3);
    }




}
下載連結 (eclipse android stuido 都有) http://download.csdn.net/download/xue9052zhou/9932116

相關推薦

Android jni 靜態註冊 動態註冊

JNI 開發流程 1.編寫native 方法 2.javah 命令,生成.h 檔案    java_類的全名_方法名    或者自己手寫    3.複製.h 標頭檔案到cpp 工程 4.複製jni.h

BroadcastReceiver(廣播)的靜態註冊動態註冊 --Android開發

encoding save private tac app tco sta content con BroadcastReceiver是安卓四大組件之一,本例通過代碼的方式演示靜態註冊和動態註冊。 1、靜態註冊 靜態註冊只需要AndroidManifest.xml中進行

Jni學習1--靜態註冊動態註冊

1.jni 靜態註冊第一步:新建java類:    System.loadLibrary後面會講到第二步:通過javah  命令生成.h檔案                                             (固定命令)        (包名)C:\My

Android靜態註冊動態註冊廣播的區別

1)靜態註冊:在AndroidManifest.xml註冊,android不能自動銷燬廣播接收器,也就是說當應用程式關閉後,還是會接收廣播。 2)動態註冊:在程式碼中通過registerReceive

Oracle listener 靜態註冊動態註冊

一、什麼是註冊?c?6zRc0註冊就是將資料庫作為一個服務註冊到監聽程式。客戶端不需要知道資料庫名和例項名,只需要知道該資料庫對外提供的服務名就可以申請連線到資料庫。這個服務名可能與例項名一樣,也有可能不一樣。ITPUB個人空間*iG1Oe+x在資料庫伺服器啟動過程中,資

Oracle listener靜態註冊動態註冊(zt)

曾經遇到一個問題,oracle10g裡通過netca命令得到的listener.ora預設就是動態監聽,但是預設沒有設定instance_name和service_names引數。我一般是先啟動db,然後啟動監聽,當時怎麼啟動監聽,通過lsnrctl status都看不到資料

Spring註解驅動開發——設定Bean屬性動態註冊Bean

1、@Scope設定元件作用域 @Configuration public class MainConfigA { @Bean("person") @Scope("singleton") public Person person(){

Android Shape Drawable 靜態使用動態使用(圓角,漸變實現)

Android Shape使用場景: 1. 圓角實現 2. 實現有邊框,有填充的背景 3. 實現一個漸變的顏色 一般情況上面三種情況我們會選擇android的shape,下面分別介紹shape的靜態使用和動態使用 1. shape的靜態使用 在drawable中建立一個xml

(七)JNI 原始碼分析、動態註冊

一、native 作用 JNITest : public class JNITest { static { System.loadLibrary("native-lib"); } public static

android 靜態動態庫編譯

android 庫的編譯依賴於nkd-build,使用之前請先安裝NDK。 編譯依賴 Android.mk 和 Application.mk 兩個檔案。 Android.mk(同時編譯靜態庫和動態庫): LOCAL_PATH := $(call my-di

android 靜態廣播動態廣播的區別用法

一、什麼是廣播 BroadcastReceiver是android 系統的四大元件之一,本質上就是一個全域性的監聽器,用於監聽系統全域性的廣播訊息,可以方便的實現系統中不同元件之間的通訊。 程式可以通過呼叫context的sendBroadcast()方法來啟動指定的Br

(轉載)Android GradientDrawable(shape標籤定義) 靜態使用動態使用(圓角,漸變實現)

最近被吐槽介面太醜,還是很尷尬的,全公司就一個UI設計師,所以很多事情還是不忍直視,一個同事問我,背景可不可以使用漸變的感覺,然後我就有種突然感覺眼前一亮的感覺。還真的沒有做過這方面的東西,單純使用漸變說真的,並不是很讓人感興趣,所以就思考著能不能在自定義視圖裡面直接定義一個

Android開發入門之實現動態註冊廣播監聽網路變化

最近在學習Android開發中廣播的相關內容。 註冊廣播的方式有兩種,在程式碼中註冊和在AndroidManifest.xml中註冊,其中前者也被稱為動態註冊,後者被稱為靜態註冊。以註冊廣播監聽網路變化為例,附上實現動態註冊的步驟: 1、 class Netwo

ffmpeg的ubuntu的編譯過程(編譯靜態動態庫)

ffmpeg第一步源碼下載通過git下載git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg或者直接下載wget http://ffmpeg.org/releases/ffmpeg-3.3.tar.bz2如果是下載的ffmpeg-3.3.tar.bz2 需要進

關於Linux靜態動態庫的分析

所在 mis color 先後 main 技術 哪些 共享 協議 關於Linux靜態庫和動態庫的分析 關於Linux靜態庫和動態庫的分析 1.什麽是庫 在windows平臺和linux平臺下都大量存在著庫。 本質上來說庫是一種可運行代碼的二進制形式。能夠被操作系

靜態動態庫的使用

window != 函數調用 img clas 處理 dllexport void 再看 1.靜態庫使用比較簡單,就兩步 @1包含靜態庫頭文件#include "文件名" @2預處理加載靜態庫 #pragma comment(lib,"庫文件名") 2.再看動態庫 @1首先

第6章 靜態路由動態路由(1)_靜態路由

align 將在 跟蹤 添加 測試 字母 ppp協議 必須 缺少 1. 路由——網絡層實現的功能 1.1 路由功能 (1)網絡層的功能:給傳輸層協議提供簡單靈活的、無連接的、盡最大努力交付的數據包服務。 (2)路由器為每一個數據包單獨地選擇轉發路徑,網絡層並不提供服務質量的

轉載 -jsp靜態包含動態包含的區別

hit 出現 ron blog col ace 報錯 否則 區別 原博地址:http://blog.csdn.net/baidu_21578557/article/details/51226678 主要從以下5方面進行分析: 1.語法: 靜態包含:<%@

oracle靜態sql動態sql

收入 性能 varchar 建立 系統 根據 ora imm arch 1.靜態SQL與動態SQLOracle編譯PL/SQL程序塊分為兩個種:  其一為前期聯編(early binding),即SQL語句在程序編譯期間就已經確定,大多數的編譯情況屬於這種類型;  另外一種

spring靜態代理動態代理

row main 同時 rac images 處理 解決 pro abstract 本節要點: Java靜態代理 Jdk動態代理 1 面向對象設計思想遇到的問題 在傳統OOP編程裏以對象為核心,並通過對象之間的協作來形成一個完整的軟件功能,由於對象可以繼承,因此我們可以