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了。