标签:
1.下载NDK并解压
2.配置NDK的环境变量
3.打开eclipse,创建一个新项目,右击项目->Android tools->add Native Support...,创建一个.so文件(名字随便取)
4.点击Finish后,我们可以看到在项目的根目录下自动生成了一个JNI文件夹,里面有两个文件Andorid.mk和HelloWorld.cpp,
Adnorid.mk是makefile文件,一般是不需要我们改的,HelloWorld.cpp,看名字就知道是c++文件,我们Java层调用c++层,c++层就指的是这里面的HelloWorld.cpp。打开HelloWorld.cpp我们看到里面除了一个#include <jni.h>头文件什么也没有。好了!
我们先讲cpp放一下,等会再来编写函数,因为在这之前我们需要先定义java层的本地方法。
5.定义本地方法
/** * 声明本地方法 * 该方法为native方法.由CPP实现 * @return JNI 给出的信息 */ public native String getStringFromJNI(); /** * 载入JNI生成的so库文件 */ static { System.loadLibrary("HelloWorld"); }声明本地方法需要注意两点:必须有native关键字,必须是抽象方法
6.编写.h文件
好了,java层的方法已经声明,现在编写c++了,在编写c++之前,我们还需要创建一个.h文件,放在JNI目录中,.h文件学过c的应该知道里面可以引入头文件,函数声明。。。那么怎么生成.h文件呢?a.javac xx.java生成xx.class文件,b.javah -jni xx 就可以生成xx.h了,如果还不知道,创建一个.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 #endifJNIEXPORT jstring JNICALL Java_com_example_helloworld_MainActivity_getStringFromJNI( JNIEnv* env,jobject thiz );是函数声明,就是你在cpp创建的函数要声明一下
7.引入.h文件
#include "HelloWorld.h",好像是自定义的.h用" ",忘掉了!接着创建函数
jstring Java_com_example_helloworld_MainActivity_getStringFromJNI( JNIEnv* env,jobject thiz ) { //返回一个字符串给Java层 return (env)->NewStringUTF("HelloWorld from JNI !"); }
在网上看到很多NewStringUTF出错,看了一下jni.h
jstring NewStringUTF(const char* bytes) { return functions->NewStringUTF(this, bytes); }
标签:
原文地址:http://blog.csdn.net/u012858313/article/details/45364831