段小白的JNI编程学习笔记

来源:互联网 发布:山西省快乐十分软件 编辑:程序博客网 时间:2024/06/10 19:12

1.环境 ndk,cygwin with gcc/g++/make

0X 1 如何在Java中调用C函数

1)在Java class中声明函数,如我们在HelloTest类中声明:public native void hello(String str);

2)在1)之前加载对于的so文件,如:System.loadLibrary("test"); //load libtest.so

 

OX 2 如何实现native函数,编译为对应的so文件

1)first我们要在和src同级的根目录下面建一个jni文件夹

2)native函数的实现

     有两种方式:

     A )可以使用javah命令生成对应的头文件,然后实现对应的函数,以前面的hello函数为例:

    在任意目录下,先运行javah命令:eg:javah -classpath absolutepath\xxx\bin\classes -jni pkgname.classname

   -classpath指定project中所有class文件的绝对路径

  执行完成后会在当前目录生产对应的.h头文件


  通过这种方式生成的文件名又长又难看,但是特点就是方便。


   B)很多程序猿都不屑第一种方法,所以他们在C文件中自己重写了JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved)

    在该函数中注册需要的native函数,

 

 

 

编译时出现的一些错误和解决方法:

NO.1 : Android NDK: Host 'awk' tool is outdated. Please define NDK_HOST_AWK to point to Gawk

1>在cygwin环境下编译,出现以上错误,你是不是在控制台使用命令打开cygwin的呢?我在控制台下打开启动cygwin执行编译命令发现报以上的错误,打开客户端编译没问题

2>工程向上找不到 libs/armeabi/目录存方输出的so,也会出现同样的错误,有的人说程序必须在jni下,经过测试,并非如此,可以在任意文件名的目录内

 

0 0
原创粉丝点击