Android JNI (Java Native Interface)就是为了实现java 与其他语言相互调用的语言。当然在Android就是为了跟C,C++的调用。在Linux ,Mac中Java最后调用的就是.so的文件,在Window中就是.dll文件。
那么Java到C怎么对应起来?调用Java的哪个方法就是C中的哪个方法呢?通过在Java类中声明native的方法就开始了。
新建一个Android工程HelloNDK。新建一个类GetString
public class GetString { public static native String GetString(); public static native String GetString(int a,int b); public static native String getWord(); }
具体的步骤如下:
1、在Java中声明native()方法,然后编译(javac);
2、用javah产生一个.h文件;
3、编写包含.h文件的c文件
4、编译c文件
5、使用编译成功的so文件。
在我建立Android Project中是怎么实现的?其实在工程的bin/classes/目录下(classes是隐藏的)就第一步就编译好了,所以我们在这目录下进行第二步,命令为:
javah -jni com.example.hellondk.GetString(包+类)
就会生成com.example.hellondk.GetString.h 头文件,只要你NDK目录配置好了,接下来就是右键工程在Android Tool中选Add Native Support 看到工程名点finish。
接下来就在工程下看到多了jni这个文件夹。里面有Android.mk,还有同工程名的.cpp文件。
把刚才生成的.h文件拷贝到jni文件夹下。
编写c文件呢先要看下.h头文件里面写的是什么
* Class: com_example_hellondk_GetString * Method: GetString * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_example_hellondk_GetString_GetString__ (JNIEnv *, jclass); /* * Class: com_example_hellondk_GetString * Method: GetString * Signature: (II)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_example_hellondk_GetString_GetString__II (JNIEnv *, jclass, jint, jint); /* * Class: com_example_hellondk_GetString * Method: getWord * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_example_hellondk_GetString_getWord (JNIEnv *, jclass);
方法名称很吓人,不过看下就知道Java跟C的方法就这样对应起来了。JNIEnv等其他参数以后再讲
接下来是实现在.cpp文件中实现这些方法。复制过去
#include "com_example_hellondk_GetString.h"
/* * Class: com_example_hellondk_GetString * Method: GetString * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_example_hellondk_GetString_GetString__ (JNIEnv * env, jclass){ return env->NewStringUTF("hello ndk"); }; /* * Class: com_example_hellondk_GetString * Method: GetString * Signature: (II)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_example_hellondk_GetString_GetString__II (JNIEnv * env, jclass, jint a, jint b){ return env->NewStringUTF("result a+b="+(a+b)); }; JNIEXPORT jint JNICALL Java_com_example_hellondk_GetInt_getInt (JNIEnv * env, jclass, jint a){ return a; };
简单的返回输出。
那现在怎么使用呢?其实我们还可以看到在工程的libs目录下生成了armeabi文件夹下生成了libHelloNDK.so库文件。这个就是我们要使用的.so库文件啦
在MainActivity中
static { System.loadLibrary("HelloNDK"); }
就可以了。接下就可以直接用GetString的方法,这样就实现了Java-->C了。