Jni函式的靜態繫結
Jni函式繫結有兩種方法,一種是靜態繫結,一種是註冊方式。當前介紹靜態繫結
1 構造Java類
package cn.search;
import java.io.File;
import android.os.Environment;
import android.util.Log;
public class PoiResolver{
public native String GetDistrictName(String storagePath, double longtitude, double latitude);
public native String GetPOIName(String storagePath, double longtitude, double latitude);
public native String GetRoadName(String storagePath, double longtitude, double latitude);
}
說明:native修飾符告訴Java編譯器這是一個繫結到JNI的函式原型
2 利用javah生成標頭檔案
本專案使用Eclipse建立Android工程,進入工程的頂級目錄,PoiResolver類檔案儲存在src/cn/search目錄下
在頂級目錄下執行如下在指令:javah -o jni/cn_search.h -classpath src/ -jni cn.search.PoiResolver
-o:指定輸出的檔名稱,將在jni下建立cn_search.h檔案,然後將標頭檔案內容寫入該檔案
-classpath:指定需要生成h檔案的類所在的包所在的位置(包cn.search在src/目錄下)
-jni:指定需要生成h檔案的類,這個時候必須指定詳細的包名+類名
可以使用-d引數,但是不能夠再使用-o引數,沒有指定檔名的情況下,預設名稱為包名+類名.h
注意
在jni的.c檔案中呼叫env,必須這樣呼叫:return (*env)->NewStringUTF(env, “Hello !”);
在jni的.cpp檔案中呼叫env,必須這樣呼叫:return env->NewStringUTF(“Hello !”);
3 編寫Application.mk
該檔案定義了哪種平臺的so檔案,進入jni資料夾,建立Application.mk檔案,寫入內容:
APP_ABI := all
將生成四種平臺的so檔案:armeabi-v7a armeabi x86 mips
使用ndk-build指令生成so檔案時候,可以通過傳遞引數,例子如下:ndk-build APP_ABI = armeabi-v7a ,單獨生成某一個平臺so檔案,當然也可以直接在檔案中修改
4 建立Android.mk檔案
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_C_INCLUDES := $(LOCAL_PATH)
LOCAL_MODULE := libsearch
LOCAL_SRC_FILES := cn_search_poiresolver.cpp
include $(BUILD_SHARED_LIBRARY)
注意
對於動態註冊的方式,函式的引數列表前面兩個引數是固定的:
static void SetSystemParameter(int paramType, int paramValue)
{
}
目前一段時間沒有寫jni介面,因此例如上面的函式定義是錯誤的,在呼叫該函式的時候,會發現傳遞進來的引數都是錯誤的,是一個非常龐大的資料,因此懷疑其實傳遞進來的其實是一個指標值!!
正確
static void SetSystemParameter(JNIEnv* env, jobject obj, jint paramType, jint paramValue)
{
}
相關文章
- C++的動態繫結和靜態繫結C++
- java中的靜態繫結與動態繫結Java
- 理解靜態繫結與動態繫結
- 後期靜態繫結
- 延遲靜態繫結——static
- php 後期靜態繫結PHP
- JNI呼叫c動態連結庫函式程式碼實踐函式
- 對 PHP 後期靜態繫結的理解PHP
- C++靜態函式C++函式
- 後期靜態繫結在PHP中的使用PHP
- 類內的靜態成員函式函式
- echarts 繫結事件處理函式Echarts事件函式
- linux 動態庫 靜態庫 函式覆蓋Linux函式
- Vue 動態繫結CSS樣式VueCSS
- url_for函式與靜態檔案函式
- 介面(抽象類)與後期靜態繫結學習抽象
- jquery繫結未來新建立函式的方法onjQuery函式
- QT之靜態函式傳送訊號QT函式
- Solidity中函式返回值,靜態動態陣列Solid函式陣列
- 函式計算支援 MySQL 例項繫結函式MySql
- C++建構函式和解構函式呼叫虛擬函式時使用靜態聯編C++函式
- 14 #### 方法分類與使用場景(繫結、靜態、類方法)
- 深入理解PHP物件導向之後期靜態繫結PHP物件
- Android:JNI與NDK(二)交叉編譯與動態庫,靜態庫Android編譯
- React中this值繫結和事件函式傳參React事件函式
- PHP 物件導向 (七)訪問物件的方式及後期靜態繫結PHP物件
- Vue 框架-05-動態繫結 css 樣式Vue框架CSS
- SAP UI5 資料繫結中的工廠函式UI函式
- Java中靜態跟非靜態的區別總結Java
- 從零玩轉jQuery-核心函式和靜態方法jQuery函式
- 如何使用 Serverless Devs 部署靜態網站到函式計算Serverdev網站函式
- Java的Panama專案與JNI以及外部函式介面FFIJava函式
- 關於動態字串的繫結字串
- vue3+TS 自定義指令:長按觸發繫結的函式Vue函式
- vue基礎-動態樣式&表單繫結&vue響應式原理Vue
- javascript中bind繫結接收者與函式柯里化JavaScript函式
- 動態連結庫與靜態連結庫
- C#未來新特性:靜態委託和函式指標C#函式指標
- JAVA動態繫結淺析Java