安卓studio jni 簡單實例
標籤(空格分隔): jni
1.Jni 是java native Interface 就是java本地接口,接口就是語言鏈接的入口。
在安卓中 我們首先寫好c文件,然後編譯成linux平臺的so文件庫。
現在,我寫一個例子來說:
首先,我們定義一個本地方法,函數內容用C語言來實現/
新建一個空,新建一個class,自己定義一個方法,然後我們用c去實現內容
fsayhello是我們定義的方法。接下來去寫c文件,javajdk爲我們提供了生成c語言頭文件的工具
再次,確定安裝了ndk,
。
。
我們在Terminal裏進行進去到包文件目錄下,javac編譯我們剛寫的java文件,生成一個class文件。
如圖:
// 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
運行後java目錄生成一個.h頭文件
內容如下:
在上面的代碼中看到了JNIEXPORT和JNICALL關鍵字,這兩個關鍵字是兩個宏定義,他主要的作用就是說明該函數爲JNI函數,在Java虛擬機加載的時候會鏈接對應的native方法,怎麼連接起來的呢,JNIEXPORT void JNICALL Java_com_blithe_higirl_MyDiyFunction_sayHello跟包名方法名來關聯你剛纔定義的函數sayHello,關聯好了,我們就可以用c來實現方法的內容了。
我們在main下建立一個cpp文件夾,把h文件放入,並新建一個.c文件來實現方法體。
導入頭文件
依舊用JNIEXPORT void JNICALL來關聯方法,來進行實現。最後,把接下來我們在build.gradle中添加ndk配置
defaultConfig {
//…
ndk {
moduleName “function”//指定生成的so文件名
abiFilters “armeabi”, “armeabi-v7a”, “x86”//cpu的類型
}
}
,然後編譯發現報錯。。我檢查了一下C文件的jstring s是小寫,然後返回值不能拼接,java寫多了,正確的c文件如圖
然後運行,再MainActivity運行,
app運行成功。。