Android中JNI实现

1. 新建Android工程(JNIPrj),编写Android代码:

 

   (1)res/layout/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/jniContent" android:layout_width = "100dip" android:layout_height = "100dip" android:gravity = "center" android:background = "@color/jni_content_color" /> </LinearLayout>

 

   (2)Activity代码:package com.focus.jni; 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文件,内容如下:/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_focus_jni_JNIActivity */ #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++文件:#include "com_focus_jni_JNIActivity.h" #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文件:LOCAL_PATH:= $(call my-dir) 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. 将工程发布到模拟器中,开发完成。

你可能感兴趣的:(android,jni,Module,layout,include,library)