1.下载NDK并解压
2.配置NDK的环境变量
3.打开eclipse,创建1个新项目,右击项目->Android tools->add Native Support...,创建1个.so文件(名字随意取)
4.点击Finish后,我们可以看到在项目的根目录下自动生成了1个JNI文件夹,里面有两个文件Andorid.mk和HelloWorld.cpp,
Adnorid.mk是makefile文件,1般是不需要我们改的,HelloWorld.cpp,看名字就知道是c++文件,我们Java层调用c++层,c++层就指的是这里面的HelloWorld.cpp。打开HelloWorld.cpp我们看到里面除1个#include
<jni.h>头文件甚么也没有。好了!
我们先讲cpp放1下,等会再来编写函数,由于在这之前我们需要先定义java层的本地方法。
5.定义本地方法
/**
* 声明本地方法
* 该方法为native方法.由CPP实现
* @return JNI 给出的信息
*/
public native String getStringFromJNI();
/**
* 载入JNI生成的so库文件
*/
static {
System.loadLibrary("HelloWorld");
}
声明本地方法需要注意两点:必须有native关键字,必须是抽象方法
6.编写.h文件
好了,java层的方法已声明,现在编写c++了,在编写c++之前,我们还需要创建1个.h文件,放在JNI目录中,.h文件学过c的应当知道里面可以引入头文件,函数声明。。。那末怎样生成.h文件呢?a.javac xx.java生成xx.class文件,b.javah -jni xx 就能够生成xx.h了,如果还不知道,创建1个.h文件,将下面的代码copy进去
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
#include <string.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: displayHelloWorld
* Signature: ()V
*/
JNIEXPORT jstring JNICALL Java_com_example_helloworld_MainActivity_getStringFromJNI( JNIEnv* env,jobject thiz );
#ifdef __cplusplus
}
#endif
#endif
JNIEXPORT jstring JNICALL Java_com_example_helloworld_MainActivity_getStringFromJNI( JNIEnv* env,jobject thiz );是函数声明,就是你在cpp创建的函数要声明1下
7.引入.h文件
#include "HelloWorld.h",好像是自定义的.h用" ",忘掉了!接着创建函数
jstring Java_com_example_helloworld_MainActivity_getStringFromJNI( JNIEnv* env,jobject thiz ) {
//返回1个字符串给Java层
return (env)->NewStringUTF("HelloWorld from JNI !");
}
解释1下:jstring是返回的类型,.h声明函数的时候不要写错,函数名的编写是固定的Java_固定不变,后面是你的包名,+类名+方法名
在网上看到很多NewStringUTF出错,看了1下jni.h
jstring NewStringUTF(const char* bytes)
{ return functions->NewStringUTF(this, bytes); }
完全没必要return (*env)->NewStringUTF(env, "HelloWorld from JNI !");
好了!JNI已写好了,但是怎样生成.so文件呢??ctrl+B build的1下就好了,这是在libs中自动生成.so 文件
然后调用就好了