国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JAVA JNI 動(dòng)態(tài)注冊(cè)

yunhao / 2617人閱讀

摘要:前面看到使用方法它有如下幾個(gè)弊端需要為每個(gè)方法的類使用生成一個(gè)頭文件生成的頭文件名太長(zhǎng)初次使用函數(shù)時(shí)需尋找層函數(shù)來(lái)建立關(guān)聯(lián),影響性能動(dòng)態(tài)注冊(cè)動(dòng)態(tài)注冊(cè)的過程主要是在時(shí)會(huì)調(diào)用函數(shù),在里面我們調(diào)用來(lái)實(shí)行注冊(cè)。

前面看到使用static natvie方法,它有如下幾個(gè)弊端:

需要為每個(gè)static natvie方法的java類使用javah生成一個(gè)頭文件

javah生成的頭文件名太長(zhǎng)

初次使用native函數(shù)時(shí)需尋找JNI層函數(shù)來(lái)建立關(guān)聯(lián),影響性能

動(dòng)態(tài)注冊(cè)

動(dòng)態(tài)注冊(cè)的過程主要是在System.loadLibrary()時(shí)會(huì)調(diào)用JNI_OnLoad()函數(shù),在里面我們調(diào)用Env->RegisterNatives來(lái)實(shí)行注冊(cè)。

例如如下的例子:

創(chuàng)建一個(gè)native類

新建一個(gè)Android空白工程,在MainActivity.java中的onCreate 中添加:

NativeClass testClass = new NativeClass();
setTitle("Native Class"+testClass.getStr()+String.valueOf(testClass.getAdd(1, 5)));

NativeClass.java :

package com.example.testdr;

public class NativeClass {
    static {
        System.loadLibrary("cpplib");
    }
    public int getAdd(int a, int b) {
        return nativeGetAdd(a, b);
    }
    public String getStr() {
        return "Title:";
    }

    private native int nativeGetAdd(int a, int b);
}
創(chuàng)建c++ native實(shí)現(xiàn)

創(chuàng)建Android.mk文件(略)

main.c

#include 
#include 
#include 

jint getAdd(JNIEnv* env, jobject obj, jint a, jint b)
{
    return (a + b);
}

static JNINativeMethod g_NativeMethods[] = {
    {"nativeGetAdd", "(II)I", (void*)getAdd},
};

static const char* classPathName = "com/example/testdr/NativeClass";

jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
    JNIEnv *env = NULL;
    if ((*vm)->GetEnv(vm, (void**)&env, JNI_VERSION_1_4) != JNI_OK) {
        return JNI_ERR;
    }
    jclass clazz = (*env)->FindClass(env, classPathName);
    if (clazz == NULL) {
        return JNI_ERR;
    }
    assert(env != NULL);
    if ((*env)->RegisterNatives(env, clazz, g_NativeMethods, 1) < 0) {
        return JNI_ERR;
    }
    return JNI_VERSION_1_4;
}

這里注意c和c++的不同,如果用c++,以上如下:

    vm->GetEnv((void**)&env, JNI_VERSION_1_4)

    jclass clazz = env->FindClass(classPathName);

    env->RegisterNatives(clazz, g_NativeMethods, 1)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/65425.html

相關(guān)文章

  • Mac OS上編譯JNI動(dòng)態(tài)庫(kù)

    摘要:在中加載的類庫(kù)注意的動(dòng)態(tài)庫(kù)在上面的命名是文件,而在上面的命名是類庫(kù)的名字需要加上也就是在上面動(dòng)態(tài)庫(kù)的名稱應(yīng)該是生成通過命令生成文件這樣就可以生成了一個(gè)的文件。在中他所在的位置是使用編譯就可以得到一個(gè)編譯好的文件下面需要把文件打包成動(dòng)態(tài)庫(kù)。 JNI是Java Native Interface的縮寫,是為了在Java上能夠調(diào)用本地語(yǔ)言尤其是C和c++設(shè)計(jì)的。 下面就看下如何在Mac OS上...

    付倫 評(píng)論0 收藏0
  • java JNI簡(jiǎn)介

    摘要:的接口函數(shù)和指針代碼想要訪問虛擬機(jī)需要調(diào)用方法,而獲取方法則通過。 JNI的接口函數(shù)和指針 native代碼想要訪問 java虛擬機(jī)需要調(diào)用JNI方法,而獲取JNI方法則通過 JNI interface Pointer。它實(shí)際指向的就是一個(gè)都是指針的數(shù)組,每個(gè)指針指向的都是一個(gè)接口函數(shù) showImg(https://segmentfault.com/img/bVbdM7A?w=150...

    NicolasHe 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<