转载自:http://blog.csdn.net/cechun/article/details/6307638
实例的开发环境: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 如下:
<?xml version="1.0" encoding="utf-8"?>
<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/JNITest"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/JNITest"
/>
</LinearLayout>
(3)编辑 strings.xml 如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="JNITest">Hello World, JNItest!</string>
<string name="app_name">JNItest</string>
</resources>
(4)编辑java文件
如下:
package com.ura.test;
importandroid.app.Activity;
import android.os.Bundle;
importandroid.widget.TextView;
public
class JNItest extends Activity {
/** Called whenthe activity is first created. */
static {
System.loadLibrary("JNITest");
}
public native static StringGetTest();
@Override
public
void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
String str =GetTest();
TextViewJNITest = (TextView)findViewById(R.id.JNITest);
JNITest.setText(str);
}
}
(5)进入工程的主目录下,然后用javah工具生成c/c++头文件。
将在主目录下生成jni文件夹
里面有个头文件,内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_ura_test_JNItest */
#ifndef _Included_com_ura_test_JNItest
#define _Included_com_ura_test_JNItest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_ura_test_JNItest
* Method: GetTest
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_ura_test_JNItest_GetTest
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
(6)在jni文件夹下编写c/c++文件如下
#include <stdio.h>
#include <stdlib.h>
#include <utils/Log.h>
#include "com_ura_test_JNItest.h"
JNIEXPORT jstring JNICALL Java_com_ura_test_JNItest_GetTest
(JNIEnv *env, jclass obj)
{
LOGD("Hello LIB!/n");
return (*env)->NewStringUTF(env, "JNITest Native String");
}
(7)在jni文件夹下编写android.mk文件
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= /
com_ura_test_JNItest.c
LOCAL_C_INCLUDES := /
$(JNI_H_INCLUDE)
LOCAL_SHARED_LIBRARIES := libutils
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE := libJNITest
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是只读的)
运行效果如图: