Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1511209
  • 博文数量: 129
  • 博客积分: 1449
  • 博客等级: 上尉
  • 技术积分: 3048
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-24 18:36
文章分类

全部博文(129)

文章存档

2015年(3)

2014年(20)

2013年(65)

2012年(41)

分类: Android平台

2014-04-18 09:23:35

1. 下载NDK, 本次版本为 r9d
wget
tar jxvf android-ndk-r9d-linux-x86.tar.bz2
cd android-ndk-r9d
mkdir jni
#将下面2个文件(qiushui_jni.c, Android.mk) 用Winscp拷贝到jni目录下即可. 编译命令如下
./ndk-build
#编译时会看到最后一行为如下:
[armeabi] Install        : libqiushui_jni.so => libs/armeabi/libqiushui_jni.so
#然后在./libs/armeabi下就能看到刚刚生成的.so文件, 将此文件用WINSCP拷贝到安卓工程的同样目录下即可.

2. NDK下的C编程和android.mk

点击(此处)折叠或打开

  1. //文件名: qiushui_jni.c

  2. #include <jni.h>
  3. #include <android/log.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>

  7. #define DBG (1) //1=Log cat输出, 0=false
  8. #define JNI_LOG "qiushui"

  9. //-------------------------------------------------------------------------------------------------
  10. //接收java中的数组, 运算后返回int类型
  11. JNIEXPORT jint JNICALL Java_qiushui_Jni_getInt(JNIEnv *env, jobject obj, jintArray arr, jint len)
  12. {
  13.   jint buf[len];
  14.   jint i, sum = 0;

  15.   (*env)->GetIntArrayRegion(env, arr, 0, len, buf);
  16.   for (i = 0; i < len; i++) {
  17.     sum += buf[i];
  18.   }

  19.   return sum;
  20. }

  21. //接收java中的String, 修改后返回String
  22. JNIEXPORT jstring JNICALL Java_qiushui_Jni_getString(JNIEnv *env, jobject obj, jstring str)
  23. {
  24.   char outbuf[128];
  25.   int len = (*env)->GetStringLength(env, str);

  26.   (*env)->GetStringUTFRegion(env, str, 0, len, outbuf);
  27.   if (DBG) __android_log_print(ANDROID_LOG_INFO, JNI_LOG, "Java->JNI: %s", outbuf);
  28.   strcat(outbuf, "---qiushui_007");

  29.   return (*env)->NewStringUTF(env, outbuf);
  30. }

点击(此处)折叠或打开

  1. #文件名: Android.mk
  2. LOCAL_PATH := $(call my-dir)

  3. include $(CLEAR_VARS)

  4. LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
  5. LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog

  6. LOCAL_MODULE := qiushui_jni
  7. LOCAL_SRC_FILES := qiushui_Jni.c

  8. include $(BUILD_SHARED_LIBRARY)

 3. android下java编程
3.1 首先写个调用so的类

点击(此处)折叠或打开

  1. package qiushui;

  2. public class Jni {
  3.     static {
  4.       System.loadLibrary("qiushui_jni");
  5.     }

  6.      public native int getInt(int[] arr, int len);
  7.     public native String getString(String str);
  8. }

3.2 然后主进程中就可以自由调用了

点击(此处)折叠或打开

  1. package huang.feng;

  2. import qiushui.Jni;

  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.widget.TextView;

  6. public class HelloNDKActivity extends Activity {
  7.     /** Called when the activity is first created. */
  8.     @Override
  9.     public void onCreate(Bundle savedInstanceState) {
  10.         super.onCreate(savedInstanceState);
  11. // setContentView(R.layout.main);
  12.         TextView textView = new TextView(this);

  13.         Jni jni = new Jni();
  14.         String str_test = "JNI str test: ";
  15.         int[] arr_int = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  16.         int len = arr_int.length;
  17.         textView.setText(jni.getString(str_test) + ", int = " + jni.getInt(arr_int, len));

  18.         setContentView(textView);
  19.     }
  20. }





阅读(1865) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~