AndroidNDK:Java方法映射到C中的签名;俗称"方法签名".
观察下面四个方法对应的签名
public void test(){} ()V
public void test1(int i){} (I)V
public int test2(){ return 1;} ()I
public int test3(int i) { return i;} (I)I
哥们,你发现什么了没 ?不错,签名是由两部分组成,"()"里面代表的是方法的参数,后面外面的部分代表的是该方法的返回值.
分为基本数据类型和引用数据类型:
基本数据类型就是对应java类型的首字母拉,Boolean比较特殊, 对应的是Z,Long对应J。
引用数据类型:比较麻烦点,以“L”开头,以“;”结束,中间对应的是该类型的路径.
如:String : Ljava/lang/String;
Object: Ljava/lang/Object;
自定义类Cat对应 package com.duicky; Cat : Lcom/duicky/Cat;
数组表示: 数组表示的时候以“[” 为标志,一个“[”表示一维数组
如:int [] :[I
Long[][] : [[J
Object[][][] : [[[Ljava/lang/Object;
打开到相应的class目录,javap –s 加上你要查看方法签名的类名;例如 $javap –s Test
C中调用Java的方法
静态: (*jniEnv)->CallStaticObjectMethod(jniEnv, TestProvider, getTime);
非静态: (*jniEnv)->CallVoidMethod(jniEnv, mTestProvider, sayHello,jstrMSG);
注意 GetXXXMethodID和CallXXXMethod。第一个XXX表示的是映射方法的类型,如:静态与非静态;第二个 XXX 表示 调用方法的返回值 ,如:Void,Object,等等。(调用静态方法的时候Call后面要加Static)。
NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。
Google明确声明该API是稳定的,API支持的功能非常有限,包含有:C标准库(libc)、标准数学库(libm)、压缩库(libz)、Log库(liblog)。
JNIEnv错误:没有将jni.h导入的缘故,解决办法,Project Properties -> C/C++ General -> Path and Symbols; 选择include标签,Add -> $Android_NDK_HOME/platforms/android-14/arch-arm/usr/include 且选中All languages. 最后Apply -> OK
bool错误:project -> properties ->c/c++ General -->code Analysis 去掉Syntax and Semantic Errors
NDK编译STL:
By default, the headers and libraries for the minimal C++ runtime system library (/system/lib/libstdc++.so) are used when building C++ sources.
You can however select a different implementation by setting the variable APP_STL to something else in your Application.mk, for example:
APP_STL := stlport_static
To select the static STLport implementation provided with this NDK.
system -> Use the default minimal C++ runtime library.
stlport_static -> Use STLport built as a static library.
stlport_shared -> Use STLport built as a shared library.
gnustl_static -> Use GNU libstdc++ as a static library.
c: 帮助文档 http://man.chinaunix.net/develop/c&c++/linux_c/default.htm
memset,将一段内存空间填入某值: void * memset (void *s ,int c, size_t n);