Jni函式的靜態繫結

技術小胖子發表於2017-11-15

    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)

{

}

     本文轉自fengyuzaitu 51CTO部落格,原文連結:http://blog.51cto.com/fengyuzaitu/1580781,如需轉載請自行聯絡原作者


相關文章