之前假设开发环境已配置好。
代码编写:
1> java代码
建立一个android应用工程MyJni,创建MyJni.java
package com.test.jni;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class MyJni extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.setText(stringFromJNI());
setContentView(tv);
}
public native String stringFromJNI();
static{
System.loadLibrary("hello");
}
}
用eclipse编译该工程,生成相应的.class文件,这步必须在下一步之前完成,因为生成.h文件需要用到相应的.class文件[一般编写代码后已经生成]。
2>编写相应的C/C++代码
刚开始学的时候,有个问题会让人很困惑,相应的C/C++代码如何编写,函数名如何定义? 这里讲一个方法,利用javah这个工具生成相应的.h文件,然后根据这个.h文件编写相应的C/C++代码。
a. 生成相应.h文件:
就拿我这的环境来说,首先在终端下进入刚刚建立的MyJni工程的目录:
hgy@ubuntu:~/workspace/MyJni$
首先我们在工程目录下建立一个jni文件夹:
mkdir jni
下面就可以生成相应的.h文件了:
javah -classpath bin -d jni classes.com.test.jni.MyJni
之后就生成头文件:
com_test_jni_MyJni.h
其内容:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
#ifndef __com_test_jni_MyJni__
#define __com_test_jni_MyJni__
#ifdef __cplusplus
extern "C"
{
#endif
JNIEXPORT jstring JNICALL Java_com_test_jni_MyJni_stringFromJNI (JNIEnv *env, jobject);
#ifdef __cplusplus
}
#endif
#endif /* __com_test_jni_MyJni__ */
MyJni.java中 stringFromJNI() 方法对应于 C/C++中的 Java_com_test_jni_MyJni_stringFromJNI() 方法.
b. 编写相应的.c文件:
hello-jni.c :
#include<string.h>
#include<jni.h>
jstring Java_com_test_jni_MyJni_stringFromJNI (JNIEnv *env, jobject o)
{
return (*env)->NewStringUTF(env,"Hello World!");
}
这里实现了Java_com_test_jni_MyJni_stringFromJNI方法,返回Hello,world.
3>编译hello-jni.c 生成相应的库
a 编写Android.mk文件
在jni目录下(即hello-jni.c 同级目录下)新建一个Android.mk文件,Android.mk 文件是Android 的 makefile文件,内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
b. 生成.so共享库文件
Android.mk文件已经编写好了,现在可以用android NDK开发包中的 ndk-build脚本生成对应的.so共享库了,方法如下:
hgy@ubuntu:~/workspace/MyJni/jni$ ndk-build
可以看到已经正确的生成了libhello.so共享库了, 我们去 libs/armeabi/ 目录下可以看到。
4)在eclipse重新编译MyJni工程,生成apk
eclipse中刷新下MyJni工程,重新编译生成apk,libhello.so共享库会一起打包在apk文件内。在模拟器中看看运行结果。