Android 开发中 JAVA 调用 C++

来源:互联网 发布:数组转字符串 编辑:程序博客网 时间:2024/06/14 05:00

[代码] 步骤 #1:使用ANT编译项目 NativeAdd.java

view source
print?
01package org.apache;
02  
03import Android.util.Log;
04  
05public class NativeAdd {
06    static{
07        try{
08            Log.i("JNI","Trying to load libNativeAdd.so");
09            System.loadLibrary("NativeAdd");
10        }
11        catch(UnsatisfiedLinkError ule) {
12            Log.e("JNI","WARNING: Could not load libNativeAdd.so");
13        }
14    }
15  
16    publicstatic nativelong add(longa, long b);
17}

[代码] 下面片断给出主activity中如何调用这个类/方法

view source
print?
01public void onClick(View view) {
02      Log.i(LOG_TAG,"onClick");
03 
04      EditText a = (EditText) findViewById(R.id.a);
05      EditText b = (EditText) findViewById(R.id.b);
06      EditText c = (EditText) findViewById(R.id.c);
07      Log.i(LOG_TAG,"calling native method");
08      longsum = NativeAdd.add( Long.parseLong(a.getText().toString()),
09              Long.parseLong(b.getText().toString()));
10      Log.i(LOG_TAG,"back from native method");
11      String text = Long.toString(sum);
12      c.setText("Native add returns = "+ text.subSequence(0, text.length()));
13  }

[代码] 步骤#2:运行下面的命令产生头文件

view source
print?
1javah -classpath ../../Android.jar;../bin/classes; org.apache.NativeAdd

[代码] 新产生的头文件“(org_apache_CallNative.h”内容如下

view source
print?
01/* DO NOT EDIT THIS FILE - it is machine generated */
02#include
03/* Header for class org_apache_NativeAdd */
04  
05#ifndef _Included_org_apache_NativeAdd
06#define _Included_org_apache_NativeAdd
07#ifdef __cplusplus
08extern "C" {
09#endif
10/*
11 * Class:     org_apache_NativeAdd
12 * Method:    add
13 * Signature: (JJ)J
14 */
15JNIEXPORT jlong JNICALL Java_org_apache_NativeAdd_add
16  (JNIEnv *, jclass, jlong, jlong);
17  
18#ifdef __cplusplus
19}
20#endif
21#endif

[代码] 步骤#3: 编写C文件如下“org_apache_NativeAdd.c”

view source
print?
1#include "org_apache_NativeAdd.h"
2  
3JNIEXPORT jlong JNICALL Java_org_apache_NativeAdd_add
4  (JNIEnv *env, jclass c, jlong a, jlong b)
5{
6    returna + b;
7}

[代码] 步骤#5: 编译和连接 org_apache_NativeAdd.c/org_apache_NativeAdd.h为一个共享库.

view source
print?
1arm-none-linux-gnueabi-gcc  -I/usr/lib/jvm/java-1.5.0-sun/include -I/usr/lib/jvm/java-1.5.0-sun/include/linux  -fpic -c org_apache_NativeAdd.c
2arm-none-linux-gnueabi-ld -T armelf_linux_eabi.xsc -shared -o libNativeAdd.so org_apache_NativeAdd.o

[代码] 步骤 #6: 复制编译文件到模拟器中. 同时安装APK程序.

view source
print?
1adb push native/libNativeAdd.so /system/lib
2adb installbin/CallNative.apk