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. 将工程发布到模拟器中,开发完成。

更多相关文章

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

随机推荐

  1. android Toast澶у叏锛堜簲绉嶆儏褰級
  2. Android官方MVP架构示例项目解析
  3. Android中的设计模式-单例模式
  4. Android打造不一样的新手引导页面(二)
  5. Android SDK工具:使用layoutopt进行布局优
  6. Android学习(一):安装并配置Android Studio
  7. Kotlin For Android:如何创建一个Kotlin项
  8. Android显示图片避免OOM和ANR小结
  9. Android软键盘的显示方式
  10. Android(安卓)Webview js或css 替换 注入