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 > 布局文件 > 背景圆角
- Android工程的自动创建,编译并生成apk
- Android实现页面跳转
- Android(安卓)WIDGETS 下的Power control修改的流程
- 解决Android(安卓)Studio 和 Android(安卓)SDK Manager 无法在线
- Android(安卓)JNI和NDK学习(3)--Android.mk分析
- Android设备重启(reboot)---Android(安卓)studio
- 【Android(安卓)Demo】让Android支持自定义的ttf字体
- Android(安卓)SDCard操作(文件读写,容量计算)