美文网首页
Android Studio环境下的NDK,你想知道的一切(一)

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

作者: 蓝胖子_Android | 来源:发表于2017-09-20 16:03 被阅读0次

    一,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

    相关文章

      网友评论

          本文标题:Android Studio环境下的NDK,你想知道的一切(一)

          本文链接:https://www.haomeiwen.com/subject/xmmvsxtx.html