摘要:前面看到使用方法它有如下幾個(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
摘要:在中加載的類庫(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上...
摘要:的接口函數(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...
閱讀 2815·2021-10-13 09:48
閱讀 3776·2021-10-13 09:39
閱讀 3586·2021-09-22 16:04
閱讀 1816·2021-09-03 10:48
閱讀 837·2021-08-03 14:04
閱讀 2358·2019-08-29 15:18
閱讀 3400·2019-08-26 12:19
閱讀 2869·2019-08-26 12:08