实例的开发环境:Eclipse +android ADT +windows xp+jdk 1.6.0.20+Vmware+Ubuntu 10.04 实例的目的::android的java 应用使用JNI(Java Native Interface)调用 C/C++开发的共享库。 现在就跟着我的步骤一步步来实现:
(1) Eclipse中新建 android工程
工程名:JNItest
Package名:com.ura.test
Activity名:JNItest
应用程序名:JNItest
(2)编辑 main.xml 如下: [size=1em][backcolor=rgb(108, 226, 108) !important][color=white !important][size=1em] ?
[size=1em]1
[size=1em]2
[size=1em]3
[size=1em]4
[size=1em]5
[size=1em]6
[size=1em]7
[size=1em]8
[size=1em]9
[size=1em]10
[size=1em]11
[size=1em]12
[size=1em]13
| [size=1em][size=1em] <?xml version="1.0" encoding="utf-8"?>
[size=1em] <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
[size=1em] android rientation="vertical"
[size=1em] android:layout_width="fill_parent"
[size=1em] android:layout_height="fill_parent"
[size=1em] >
[size=1em] <TextView
[size=1em] android:id="@+id/JNITest"
[size=1em] android:layout_width="fill_parent"
[size=1em] android:layout_height="wrap_content"
[size=1em] android:text="@string/JNITest"
[size=1em] />
[size=1em]</LinearLayout>
|
(3)编辑 strings.xml 如下: [size=1em][backcolor=rgb(108, 226, 108) !important][color=white !important][size=1em] ?
[size=1em]1
[size=1em]2
[size=1em]3
[size=1em]4
[size=1em]5
| [size=1em][size=1em]<?xml version="1.0" encoding="utf-8"?>
[size=1em] <resources>
[size=1em] <string name="JNITest">Hello World, JNItest!</string>
[size=1em] <string name="app_name">JNItest</string>
[size=1em] </resources>
|
(4)编辑java文件 [size=1em][backcolor=rgb(108, 226, 108) !important][color=white !important][size=1em] ?
[size=1em]1
[size=1em]2
[size=1em]3
[size=1em]4
[size=1em]5
[size=1em]6
[size=1em]7
[size=1em]8
[size=1em]9
[size=1em]10
[size=1em]11
[size=1em]12
[size=1em]13
[size=1em]14
[size=1em]15
[size=1em]16
[size=1em]17
[size=1em]18
[size=1em]19
[size=1em]20
[size=1em]21
[size=1em]22
[size=1em]23
[size=1em]24
[size=1em]25
[size=1em]26
[size=1em]27
[size=1em]28
[size=1em]29
[size=1em]30
[size=1em]31
[size=1em]32
[size=1em]33
[size=1em]34
[size=1em]35
[size=1em]36
[size=1em]37
[size=1em]38
[size=1em]39
[size=1em]40
[size=1em]41
[size=1em]42
[size=1em]43
[size=1em]44
[size=1em]45
| [size=1em][size=1em]package com.ura.test;
[size=1em]
[size=1em]importandroid.app.Activity;
[size=1em]import android.os.Bundle;
[size=1em]importandroid.widget.TextView;
[size=1em]public
[size=1em]class JNItest extends Activity {
[size=1em]/** Called whenthe activity is first created. */
[size=1em]static {
[size=1em]System.loadLibrary("JNITest");
[size=1em]}
[size=1em]public native static StringGetTest();
[size=1em]@Override
[size=1em]public
[size=1em]void onCreate(BundlesavedInstanceState) {
[size=1em] super.onCreate(savedInstanceState);
[size=1em] setContentView(R.layout.main);
[size=1em] String str =GetTest();
[size=1em] TextViewJNITest = (TextView)findViewById(R.id.JNITest);
[size=1em] JNITest.setText(str);
[size=1em] }
[size=1em]}
|
如下:
(5)进入工程的主目录下,然后用javah工具生成c/c++头文件。
将在主目录下生成jni文件夹
里面有个
头文件,内容如下: [size=1em][backcolor=rgb(108, 226, 108) !important][color=white !important][size=1em] ?
[size=1em]1
[size=1em]2
[size=1em]3
[size=1em]4
[size=1em]5
[size=1em]6
[size=1em]7
[size=1em]8
[size=1em]9
[size=1em]10
[size=1em]11
[size=1em]12
[size=1em]13
[size=1em]14
[size=1em]15
[size=1em]16
[size=1em]17
[size=1em]18
[size=1em]19
[size=1em]20
[size=1em]21
[size=1em]22
[size=1em]23
[size=1em]24
[size=1em]25
[size=1em]26
[size=1em]27
[size=1em]28
[size=1em]29
[size=1em]30
[size=1em]31
[size=1em]32
[size=1em]33
| [size=1em][size=1em]/* DO NOT EDIT THIS FILE - it is machine generated */
[size=1em]#include <jni.h>
[size=1em]/* Header for class com_ura_test_JNItest */
[size=1em]#ifndef _Included_com_ura_test_JNItest
[size=1em]#define _Included_com_ura_test_JNItest
[size=1em]#ifdef __cplusplus
[size=1em]extern "C" {
[size=1em]#endif
[size=1em]/*
[size=1em]* Class: com_ura_test_JNItest
[size=1em]* Method: GetTest
[size=1em]* Signature: ()Ljava/lang/String;
[size=1em]*/
[size=1em]JNIEXPORT jstring JNICALL Java_com_ura_test_JNItest_GetTest
[size=1em] (JNIEnv *, jclass);
[size=1em]#ifdef __cplusplus
[size=1em]}
[size=1em]#endif
[size=1em]#endif
[size=1em](6)在jni文件夹下编写c/c++文件如下
[size=1em]#include <stdio.h>
[size=1em]#include <stdlib.h>
[size=1em]#include <utils/Log.h>
[size=1em]#include "com_ura_test_JNItest.h"
[size=1em]JNIEXPORT jstring JNICALL Java_com_ura_test_JNItest_GetTest
[size=1em] (JNIEnv *env, jclass obj)
[size=1em]{
[size=1em] LOGD("Hello LIB!/n");
[size=1em] return (*env)->NewStringUTF(env, "JNITest Native String");
[size=1em]}
|
(7)在jni文件夹下编写android.mk文件 [size=1em][backcolor=rgb(108, 226, 108) !important][color=white !important][size=1em] ?
[size=1em]1
[size=1em]2
[size=1em]3
[size=1em]4
[size=1em]5
[size=1em]6
[size=1em]7
[size=1em]8
[size=1em]9
[size=1em]10
| [size=1em][size=1em]LOCAL_PATH:= $(call my-dir)
[size=1em]include $(CLEAR_VARS)
[size=1em]LOCAL_SRC_FILES:= /
[size=1em] com_ura_test_JNItest.c
[size=1em]LOCAL_C_INCLUDES := /
[size=1em] $(JNI_H_INCLUDE)
[size=1em]LOCAL_SHARED_LIBRARIES := libutils
[size=1em]LOCAL_PRELINK_MODULE := false
[size=1em]LOCAL_MODULE := libJNITest
[size=1em]include $(BUILD_SHARED_LIBRARY)
|
(8)编译生成动态库
在ubuntu的android源码下面新建文件夹
~/myandroid/external/libJNITest
把上面jni文件夹下编写好的头文件,C/C++源文件,make文件拷贝进上面的目录中
在ubuntu中执行
Cd myandroid
. ./build/envsetup.sh
Cd external/libJNITest/
mm
如图:
编译成功的后会在下面目录中生成libJNITest.so文件~myandroid/out/target/product/generic/system/lib/ 然后将libJNITest.so文件放入到windowsXP下android的SDK主目录下的tools文件夹下 (9)在模拟器中执行程序 启动模拟器
进入SDK主目录下的tools文件夹
如下
输入adbdevices如下图后:
然后输入adb remount如下图:
然后输入adb push libJNITest.so /system/lib
如果成功了就可以看到
(10)然后运行程序 Eclipse下的JNITest工程(注明:上面开的模拟器不要关闭,关掉再开动态库就没有了,模拟器的system是只读的) 运行效果如图:
|