1.先安装好jdk,ndk,进行准备
2.在eclipse下创建Android一个工程:Jnitest
JniTest.java
public class JniTest extends Activity {
TextView tv1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_jni_test);
tv1 = (TextView) findViewById(R.id.textView1);
tv1.setText(welcome("呵呵"));
}
static {
System.loadLibrary("jnitest");
}
public native String welcome(String who);
}
3.编译该工程:使用project--clean--当前工程。生成相应的.class文件。
4.打开终端:cd 到当前项目,比如说我的是 cd workspace/Jnitest,然后执行javah -classpath bin/classes -d jni 包名.类名,我的是javah -classpath bin/classes -d jni com.example.jnitest.JniTest.执行成功后会在项目目录下生成一个jni文件夹,里面有相对应的.h文件,我的是com_example_jnitest_JniTest.h。
5.在jni文件下编写c++文件(或c文件)
com_example_jnitest_JniTest.cpp
#include "com_example_jnitest_JniTest.h"
#include <string.h>
#include <jni.h>
JNIEXPORT jstring JNICALL Java_com_example_jnitest_JniTest_welcome(JNIEnv *env,
jobject obj, jstring who) {
return env->NewStringUTF("Hello 旺旺 !");;
}
6.在jni文件下编写Android.mk文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libjnitest
LOCAL_SRC_FILES := com_example_jnitest_JniTest.cpp
include $(BUILD_SHARED_LIBRARY)
7.在终端下cd到该工程目录下:cd workspace/Jnitest
执行:ndk-build
执行成功会出现
[armeabi] Compile++ thumb: jnitest <= com_example_jnitest_JniTest.cpp
[armeabi] SharedLibrary : libjnitest.so
[armeabi] Install : libjnitest.so => libs/armeabi/libjnitest.so
生成了 .so 文件,我们可以在 libs/armeabi/ 目录下找到该文件
执行不成功则会出现相应的错误,自己查找改错。
8.运行该工程则会在textView里面显示“Hello 旺旺 !”
注意:
1.如果你编写的是.c文件,那么则要做修改输出
jstringJava_com_example_jnitest_JniTest_welcome(JNIEnv *env,
jobject obj, jstring who) {
return (*env)->NewStringUTF(env, "hello,旺旺!");
}
这是c和c++文件的区别。
2.在ndk-build之后可能会出现:APP_PLATFORM android-19 is larger than android:minSdkVersion 8 in ./AndroidManifest.xml
这不影响我们的操作,如果想去掉它,则在Android,mk文件下添加:APP_PLATFORM := android-8就可以了。
3.编写c和c++文件的时候注意要和.h文件里面的函数名称相同。
GOOD LUCY!!!!!!!!