安卓studio jni 簡單實例demo

安卓studio jni 簡單實例

標籤(空格分隔): jni


1.Jni 是java native Interface 就是java本地接口,接口就是語言鏈接的入口。

在安卓中 我們首先寫好c文件,然後編譯成linux平臺的so文件庫。

現在,我寫一個例子來說:


  1. 首先,我們定義一個本地方法,函數內容用C語言來實現/

    360截圖20180530102550683.jpg-59.6kB
    新建一個空,新建一個class,自己定義一個方法,然後我們用c去實現內容

    360截圖20180530102550683.jpg-37kB
    fsayhello是我們定義的方法。接下來去寫c文件,javajdk爲我們提供了生成c語言頭文件的工具
    再次,確定安裝了ndk,
    360截圖20180530102550683.jpg-72kB
    360截圖20180530102550683.jpg-29.8kB
    我們在Terminal裏進行進去到包文件目錄下,javac編譯我們剛寫的java文件,生成一個class文件。
    如圖:360截圖20180530102550683.jpg-8.7kB


    // Source code recreated from a .class file by IntelliJ IDEA
    // (powered by Fernflower decompiler)
    package com.blithe.higirl;
    public class MyDiyFunction {
    public MyDiyFunction() {
    }
    public static native void sayHello(String var0);
    }

    javah -jni可以自動幫我們對應MyDiyFunction.class生成包含一個c頭文件
    方法如下:
    Terminal 下回退到java目錄下:
    運行javah -jni MyDiyFunction
    360截圖20180530102550683.jpg-11.9kB
    運行後java目錄生成一個.h頭文件
    360截圖20180530102550683.jpg-19.2kB
    內容如下:360截圖20180530102550683.jpg-38.2kB
    在上面的代碼中看到了JNIEXPORT和JNICALL關鍵字,這兩個關鍵字是兩個宏定義,他主要的作用就是說明該函數爲JNI函數,在Java虛擬機加載的時候會鏈接對應的native方法,怎麼連接起來的呢,JNIEXPORT void JNICALL Java_com_blithe_higirl_MyDiyFunction_sayHello跟包名方法名來關聯你剛纔定義的函數sayHello,關聯好了,我們就可以用c來實現方法的內容了。
    我們在main下建立一個cpp文件夾,把h文件放入,並新建一個.c文件來實現方法體。
    導入頭文件 360截圖20180530102550683.jpg-38.3kB
    依舊用JNIEXPORT void JNICALL來關聯方法,來進行實現。

    最後,把接下來我們在build.gradle中添加ndk配置

    defaultConfig {
    //…
    ndk {
    moduleName “function”//指定生成的so文件名
    abiFilters “armeabi”, “armeabi-v7a”, “x86”//cpu的類型
    }
    }
    ,然後編譯發現報錯。。我檢查了一下C文件的jstring s是小寫,然後返回值不能拼接,java寫多了,正確的c文件如圖
    31111圖20180530152810724.jpg-29kB
    然後運行,再MainActivity運行,31111圖20180530152810724.jpg-26.8kB

app運行成功。。qq.png-36.3kB

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章