实例的开发环境: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]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 ![]() [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][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][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][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][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是只读的)
运行效果如图:
欢迎光临 中科因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/) | Powered by Discuz! X3.4 |