1. 新建Android工程(JNIPrj),编写Android代码:
(1)res/layout/main.xml代码:
<LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
android:orientation = "vertical"
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
>
<TextView
android:id = "@+id/jniContent"
android:layout_width = "100dip"
android:layout_height = "100dip"
android:gravity = "center"
android:background = "@color/jni_content_color"
/>
</LinearLayout>
(2)Activity代码:
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class JNIActivity extends Activity {
/**
* 加载.SO库。
*/
static {
System.loadLibrary("mayingcai");
}
/**
* 定义JNI接口(native关键字)
*
* @return 从C中返回字符串。
*/
public native String getJNIContent();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/**
* 调用JNI接口获取字符串。
*/
String mJNIContentStr = getJNIContent();
TextView mJNIContent = (TextView) findViewById(R.id.jniContent);
mJNIContent.setText(mJNIContentStr);
}
}
2. 生成Head文件:
进入工程根目录执行:javah -classpath bin -d jni 包名 + Activity名(包含JNI文件的包名与类名),生成以.h结尾的Head文件,内容如下:
#ifndef _Included_com_focus_jni_JNIActivity
#define _Included_com_focus_jni_JNIActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_focus_jni_JNIActivity
* Method: getJNIContent
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_focus_jni_JNIActivity_getJNIContent
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
3. 根据生成的Head文件编写C/C++文件:
#define LOG_TAG "JNIActivity"
#undef LOG
#include < utils/Log.h>
JNIEXPORT jstring JNICALL Java_com_focus_jni_JNIActivity_getJNIContent(JNIEnv *, jobject){
return (*env)->NewStringUTF(env, (char *)"mayingcai");
LOGD("Hello mayingcai!/n");
};
4. 编写Android.mk文件:
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= /com_focus_jni_JNIActivity.c
LOCAL_C_INCLUDES:= /$(JNI_H_INCLUDE)
LOCAL_SHARED_LIBRARIES := libutils
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE := libmayingcai
include $(BUILD_SHARED_LIBRARY)
解释:
(1)LOCAL_SRC_FILES:编译的源文件。
(2)LOCAL_C_INCLUDES:需要包含的头文件目录。
(3)LOCAL_SHARED_LIBRARIES:链接时需要的外部库。
(4)LOCAL_PRELINK_MODULE:是否需要prelink处理(一般为false)。
(5)LOCAL_MODULE:生成的.so文件名称(lib + 自定义名称 + .so,必须是这种格式,自定义的名称是Java代码:
System.loadLibrary("mayingcai");中用到的名称,例:libmayingcai.so)。
(6)BUILD_SHARED_LIBRARY:指明要编译成动态库。
5. 生成.so文件:
(1)在Android源码目录/external目录下新建目录,将.h文件,.c文件,Android.mk文件拷入。
(2)进入Android源码根目录。
(3)build/envsetup.sh。
(4)cd Android源码目录/external目录下新建目录。
(5)mm命令,这时在Android源码目录/out/target/product/生成目录/system/lib目录中生成lib + 自定义名称 + .so文件。
6. 在Android工作的根目录中新建libs/armeabi目录,将生成的.so文件拷贝到此目录中。
7. 将工程发布到模拟器中,开发完成。