Android Studio环境下的NDK,你想知道的一切(一)

2017-09-20  本文已影响0人  蓝胖子_Android

一,android中libs目录下armeabi和armeabi-v7a的区别

armeabi默认选项,

支持基于ARM* v5TE 的设备

支持软浮点运算(不支持硬件辅助的浮点计算)

支持所有ARM* 设备

armeabi-v7a

支持基于 ARM* v7 的设备

支持硬件 FPU 指令

支持硬件浮点运算

不同手机由于cpu的不同,使用不同的驱动。

ABI:指应用基于哪种指令集来进行编译,ABI总共有四种,分别是armeabi、armeabi-v7a、mips、x86,它们都是表示cpu的类型。

二,so动态库的编译方式

1,MK文件

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

APP_PLATFORM := android-19

APP_STL      := gnustl_shared

#so动态库名称

LOCAL_MODULE    := hello

LOCAL_LDLIBS += -llog

LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

#include path 如果文件比较多就可以通过添加路径的方式

#LOCAL_CFLAGS := -I$(LOCAL_PATH)/third-party

LOCAL_SRC_FILES :=  hello.cpp

LOCAL_SRC_FILES +=  .cpp

#添加本地库

#LOCAL_LDLIBS += -llog -pthread -L$(LOCAL_PATH)/third-party -event

include $(BUILD_SHARED_LIBRARY)  #如果编译静态库,需要Application.mk

2,如何使用

1,创建一个Java类JNITest

packagecom.jnidemo;

/**

* Created by 徐敏 on 2017/9/18.

*/

public class JNITest {

static{

System.loadLibrary("hello");

}

//在Native层返回一个Student对象

public nativeStudentnativeGetStudentInfo();

//给Nativie层调用的一个函数

publicStringgetStringFromJava(){

return"getStringFromJava";

}

}

2,打开android studio Terminal控制台,cd到工程java目录,执行jni命令:

javah  -jni com.jnidemo.JNITest

查看方法签名:

查看自定义类:

转到class目录下执行:

[java]view plaincopy

javap -s  com.example.ndksocket.MainActivit

5,生成的头文件copy到Jni目录中

6,创建一个com_jnidemo_JNITest.cpp文件:

#include

#include

#include

extern"C"

JNIEXPORTjobjectJNICALLJava_com_jnidemo_JNITest_nativeGetStudentInfo(JNIEnv* env,jobjectobl){

//关于包描述符,这儿可以是 com/jnidemo/Student 或者是 Lcom/feixun/jni/Student;

//  这两种类型 都可以获得class引用

jclassstucls = env->FindClass("com/jnidemo/Student");//或得Student类引用

jclassjnicls = env->GetObjectClass(obl);//或得Student类引用

jmethodIDgetStringMid=env->GetMethodID(jnicls,"getStringFromJava","()Ljava/lang/String;");

jstringresult=(jstring)env->CallObjectMethod(obl,getStringMid);

//获得得该类型的构造函数  函数名为 返回类型必须为 void 即 V

jmethodIDconstrocMID = env->GetMethodID(stucls,"","(ILjava/lang/String;)V");

jstringstr = env->NewStringUTF(" come from Native ");

jobjectstu_ojb = env->NewObject(stucls,constrocMID,11,result);//构造一个对象,调用该类的构造函数,并且传递参数

returnstu_ojb;

}

8,MK文件中添加这个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)  #如果编译静态库,需要Application.mk

9,编译  :ndk-build

参考:http://blog.csdn.net/qinjuning/article/details/7607214

上一篇下一篇

猜你喜欢

热点阅读