一,android中l(wèi)ibs目錄下armeabi和armeabi-v7a的區(qū)別
支持基于ARM* v5TE 的設(shè)備
支持軟浮點(diǎn)運(yùn)算(不支持硬件輔助的浮點(diǎn)計(jì)算)
支持所有ARM* 設(shè)備
armeabi-v7a
支持基于 ARM* v7 的設(shè)備
支持硬件 FPU 指令
支持硬件浮點(diǎn)運(yùn)算
不同手機(jī)由于cpu的不同,使用不同的驅(qū)動(dòng)。
ABI:指應(yīng)用基于哪種指令集來(lái)進(jìn)行編譯,ABI總共有四種,分別是armeabi、armeabi-v7a、mips、x86,它們都是表示cpu的類(lèi)型。
二,so動(dòng)態(tài)庫(kù)的編譯方式
1,MK文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
APP_PLATFORM := android-19
APP_STL? ? ? := gnustl_shared
#so動(dòng)態(tài)庫(kù)名稱
LOCAL_MODULE? ? := hello
LOCAL_LDLIBS += -llog
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
#include path 如果文件比較多就可以通過(guò)添加路徑的方式
#LOCAL_CFLAGS := -I$(LOCAL_PATH)/third-party
LOCAL_SRC_FILES := ?hello.cpp
LOCAL_SRC_FILES += ?.cpp
#添加本地庫(kù)
#LOCAL_LDLIBS += -llog -pthread -L$(LOCAL_PATH)/third-party -event
include $(BUILD_SHARED_LIBRARY)? #如果編譯靜態(tài)庫(kù),需要Application.mk
2,如何使用
1,創(chuàng)建一個(gè)Java類(lèi)JNITest
packagecom.jnidemo;
/**
* Created by 徐敏 on 2017/9/18.
*/
public class JNITest {
static{
System.loadLibrary("hello");
}
//在Native層返回一個(gè)Student對(duì)象
public nativeStudentnativeGetStudentInfo();
//給Nativie層調(diào)用的一個(gè)函數(shù)
publicStringgetStringFromJava(){
return"getStringFromJava";
}
}
2,打開(kāi)android studio Terminal控制臺(tái),cd到工程java目錄,執(zhí)行jni命令:
javah? -jni com.jnidemo.JNITest
查看方法簽名:
查看自定義類(lèi):
轉(zhuǎn)到class目錄下執(zhí)行:
[java]view plaincopy
javap?-s??com.example.ndksocket.MainActivit
5,生成的頭文件copy到Jni目錄中
6,創(chuàng)建一個(gè)com_jnidemo_JNITest.cpp文件:
#include
#include
#include
extern"C"
JNIEXPORTjobjectJNICALLJava_com_jnidemo_JNITest_nativeGetStudentInfo(JNIEnv* env,jobjectobl){
//關(guān)于包描述符,這兒可以是 com/jnidemo/Student 或者是 Lcom/feixun/jni/Student;
//? 這兩種類(lèi)型 都可以獲得class引用
jclassstucls = env->FindClass("com/jnidemo/Student");//或得Student類(lèi)引用
jclassjnicls = env->GetObjectClass(obl);//或得Student類(lèi)引用
jmethodIDgetStringMid=env->GetMethodID(jnicls,"getStringFromJava","()Ljava/lang/String;");
jstringresult=(jstring)env->CallObjectMethod(obl,getStringMid);
//獲得得該類(lèi)型的構(gòu)造函數(shù)? 函數(shù)名為 返回類(lèi)型必須為 void 即 V
jmethodIDconstrocMID = env->GetMethodID(stucls,"","(ILjava/lang/String;)V");
jstringstr = env->NewStringUTF(" come from Native ");
jobjectstu_ojb = env->NewObject(stucls,constrocMID,11,result);//構(gòu)造一個(gè)對(duì)象,調(diào)用該類(lèi)的構(gòu)造函數(shù),并且傳遞參數(shù)
returnstu_ojb;
}
8,MK文件中添加這個(gè)cpp文件:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
APP_PLATFORM := android-19
APP_STL? ? ? := gnustl_shared
LOCAL_MODULE? ? := hello
LOCAL_LDLIBS += -llog
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
LOCAL_SRC_FILES :=? com_jnidemo_JNITest.cpp
include $(BUILD_SHARED_LIBRARY)? #如果編譯靜態(tài)庫(kù),需要Application.mk
9,編譯 ?:ndk-build
參考:http://blog.csdn.net/qinjuning/article/details/7607214