关于什么是JNI,我想对于学习android的人一定不会陌生,如果实在不了解你可以GOOGLE一下,本人就不解释了。我今天主要想通过一个实例,让大家感受下它的使用。先介绍下我的一些开发环境和目的:
实例的开发环境: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是只读的)
运行效果如图:
至今只有一个问题 关于ndk
如何断点调试?
我在MAC下为什么报这样的错误呢