新建android项目
1.首先声明native方法 这里我们在MainActivity中声明Navtive方法
public class MainActivity extends ActionBarActivity {
public native String HelloWorld();//1
static{
System.loadLibrary("Hello");
}
private TextView text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text=(TextView) this.findViewById(R.id.text);
text.setText(HelloWorld());
}
}
然后选中项目->Android Tools->Add Native Support填写名称 点击Finish 这里我以HelloJni为例
这时会在项目下生成JNI目录 其中有两个文件
第一个文件 HelloJni.cpp 注意此后缀是cpp 也就是C++代码的源文件 那么里面当然要写C++的代码了
具体代码
#include <jni.h>
extern "C"{
jstring Java_com_android_hellojni_MainActivity_HelloWorld(JNIEnv *env, jobject thiz)
{
return env->NewStringUTF( "Hello from JNI !");
}
}
首先第一句#include<jni.h>引入jni.h 头部文件
查看下AndroidManifest.xml配置文件其中 minSdkVersion=10
那么头部文件源代码在 android-ndk-r10d\platforms\android-9\arch-arm\usr\include中
基于AndroidManifest.xml中的minSdkVersion属性选择jni.h文件
第三句 jstring Java_com_android_hellojni_MainActivity_HelloWorld(JNIEnv *env,jobject thiz){}
其中 jstring表示我们返回String类型
Java_完整包名类名_方法名
这里Java的J首字母一定要大写
其中有两个参数
JNIEnv指针是JVM创建的,用于Native的c/c++方法操纵Java执行栈中的数据
jobject 表示当前java对象 例如 MainActivity
这里说明下为什么要extern "C"
由于我们是C++代码 当cpp编译器 编译代码时 就有可能把这个函数改成 _Java_com_android_hellojni_MainActivity_HelloWorldjj
而C编译的时候会把他编译成 _Java_com_android_hellojni_MainActivity_HelloWorld
当我们使用jni调用时 他会去找 _Java_com_android_hellojni_MainActivity_HelloWorld这个标识 但是找不到
而我们使用 extern "C"后 那么都会引用一个 _Java_com_android_hellojni_MainActivity_HelloWorld标识
不知道这里理解的对不对,请指出
第二个文件 Android.mk
获取当前文件内容 : $(call my-dir) 是编译器中的宏方法, 调用该宏方法, 就会返回前的目录路径;
赋值符号 : " := " 是赋值符号, 第一句话 是 返回当前文件所在的当前目录, 并将这个目录路径赋值给 LOCAL_PATH;
初始化编译模块参数 : $(CLEAR_VARS) 作用是将编译模块的参数初始化, LOCAL_MODULE LOCAL_SRC_FILES 也是这样的参数;
指定编译模块 : LOCAL_MODULE := hello , 指定编译后的 so 文件名称, 编译好之后系统会在该名称前面加上 "lib", 后缀加上 ".so";
指定编译源文件 : LOCAL_SRC_FILES := hello.c 告诉编译系统源文件, 如果有多个文件那么就依次写在后面即可;
编译成静态库 : include $(BUILD_SHARED_LIBRARY), 作用是高速系统, 编译的结果编译成 .so 后缀的静态库;
然后在cmd命令中 输入cd D:\MySoft\adt-bundle-windows-x86_64-20140702\eclipse\workspace\HelloJni\jni 切换到项目下的jni目录中 然后输入ndk-build命令进行编译,完成后会自动引入项目 lib下armeabi下
最后我们使用
System.loadLibrary("Hello")引入
然后通过text.setText(HelloWorld());调用即可