您的位置:首页 > 移动开发 > Android开发

借助NDK,Android与C动态链接库的相互调用

2014-02-21 11:29 573 查看
大致流程:首先你要安装好NDK,官方链接。这份代码是在\android-ndk-r9c\samples\hello-jni基础上修改的,先看一下目录结构:其中的libs和obj文件夹是在第四步编译后生成。1.编写Java代码 HelloJni.java
package com.tuojie.hellojni;

import android.app.Activity;
import android.widget.TextView;
import android.os.Bundle;

public class HelloJni extends Activity {

static {
// 加载libhello-jni.so库
System.loadLibrary("hello-jni");
}

private static int si;
// 由C调用的静态方法
private static void callback() {
si = 123;
}

// 本地方法,调用C的方法
public native String stringFromJNI();

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

TextView tv = new TextView(this);
// 将调用的结果显示在TextView上
tv.setText(stringFromJNI());
setContentView(tv);
}

}
2.编写C代码:hello-jni.c
#include <string.h>
#include <jni.h>
// 这里的方法和Java里的本地方法相对应
jstring Java_com_tuojie_hellojni_HelloJni_stringFromJNI(JNIEnv* env,
jobject thiz) {

// 得到调用此方法的类的实例
jclass cls = (*env)->GetObjectClass(env, thiz);

// 得到Java里callback()方法的id,为下面调用作准备
jmethodID mid = (*env)->GetStaticMethodID(env, cls, "callback", "()V");

// 调用该方法
(*env)->CallStaticVoidMethod(env, cls, mid);

// 得到方法里的静态变量的id
jfieldID fid = (*env)->GetStaticFieldID(env, cls, "si", "I");

// 得到变量的值
jint si = (*env)->GetStaticIntField(env, cls, fid);
if (si == 123) {
return (*env)->NewStringUTF(env, "C invoke Java successful!");
}

return (*env)->NewStringUTF(env, "C invoke Java failed!");
}
3.编写Application.mk 和 Android.mk文件(如果使用官方sample,可以不做修改)Application.mk
APP_ABI := all
Android.mk
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := hello-jni.c

include $(BUILD_SHARED_LIBRARY)
4.用NDK命令编译c文件为.so格式
5.运行即可:大致如上。
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ndk android java C