[20]jni

  •                                  [20]jni

  • c代码 (编译、链接)

  • 编译: c源代码 编译成2进制文件

  • 链接: 根据当前的系统平台、cpu平台,加入所能执行的文件库~~ 生成一个可执行的2

  • 进制文件

  • 电脑 cpu x86(inter amd) 系统指令集不同

  • 手机 cpu arm

  • android手机

  • 系统 linux  arm

  • 交叉编译: 在一个平台上(x86) 可以编译另一个平台(arm)上可以运行的代码

  • 工具  NDK (native develop kits )  

  • ndk 必须在linux下运行

  • 当前的操作系统 windows

  • 虚拟机

  • VMWare  

  • Cygwin: 在 windows下 模拟出 linux系统的环境

  • Cygwin 插件的方式安装组件  

  • C:\cygwin\etc\profile

  • 23行  PATH="/usr/local/bin:/cygdrive/d/android-ndk-r7b:/usr/bin:${PATH}"

  • LOCAL_PATH := $(call my-dir)

  • #指定Android.mk文件的位置  

  • #call my-dir 获取文件所在目录

  • #初始化(重置)编译参数

  • #CLEAR_VARS 清除参数信息

  • include $(CLEAR_VARS)

  • # 定义编译好的库文件的名称

  • LOCAL_MODULE    := Hello

  • # 指定哪些C的源代码需要编译

  • LOCAL_SRC_FILES := Hello.c     

  • include $(BUILD_SHARED_LIBRARY)

  • #指定编译好的库文件的类型

  • # 有2种类型

  • # BUILD_SHARED_LIBRARY 动态链接库

  • #    扩展名 .so

  • #    库文件小        程序执行时 所要用到的库文件(方法) 要用到的时候 才去加

  • 载(动态) 所记录只是找到库的链接

  • # BUILD_STATIC_LIBRARY 静态链接库

  • #    扩展名 .a

  • #    库文件大        程序执行时 所要用到的库文件(方法)都进行了封装,都封装

  • 到.a 库文件里

  • # 动态库 与 静态的好处

  • # 动态库  好: 库文件小  程序小    坏: 给他人用的时候 容易出错(对方没有这

  • 个所指向的库文件)

  • # 静态库 好: 他人用的时候 不会出错误   坏:  库文件大  程序大

  • LOCAL_LDLIBS += -llog

  • #将日志库 引入进来 让c可以打印日志  liblog.so

  • ndk开发 常见问题

  • 1\ Android.mk   LOCAL_MODULE    := Hell0和 System.loadLibrary("Hello");不是同一个库

  • 08-09 Caused by: java.lang.UnsatisfiedLinkError:

  • Couldn't load Hello: findLibrary returned null

  • 2、java中的本地方法名 和c中的方法名 签名不一致

  • 08-09 06:32:27.036: E/AndroidRuntime(449):

  • java.lang.UnsatisfiedLinkError: helloFromC

  • 3、c代码中 方法 参数没有补全

  • F:/itcast0605/jni02/code/Ndk/jni/Hello.c:10: error: parameter name omitted

  • 4、在c代码中  参数类型不一致 想要jstring  我们给的是cstring

  • 画面一闪 就没了

  • 5、     代表的就是我们库挂了~~  c代码 出现逻辑性的问题

  • 很多行绿色Debug

  • 获得方法jni头文件 javah 类名.class

  • 获得方法的签名 javap -s 类名.class

  • F:\itcast0605\jni02\code\Callback\bin\classes>javap -s

  • cn.itcast.ndk4.DataProvid

  • er

  • Compiled from "DataProvider.java"

  • public class cn.itcast.ndk4.DataProvider extends java.lang.Object{

  • public cn.itcast.ndk4.DataProvider();

  •   Signature: ()V

  • public native void callback1();

  •   Signature: ()V

  • public native void callback2();

  •   Signature: ()V

  • public native void callback3();

  •   Signature: ()V

  • public void helloFromJava();

  •   Signature: ()V

  • public int Add(int, int);

  •   Signature: (II)I

  • public void printString(java.lang.String);

  •   Signature: (Ljava/lang/String;)V

  • }


你可能感兴趣的:(linux,虚拟机,windows,源代码,develop)