借助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 := allAndroid.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.运行即可:大致如上。
相关文章推荐
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- 解決Linux下Android开发真机调试设备不被识别问题
- PropertyChangeListener简单理解
- [Android]在代码里运行另一个程序的方法
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统
- java很神奇 用swing制作欢迎屏幕
- java自动生成验证码插件-kaptcha
- ITeye上“10个人,8个人不会解释这个问题”的帖子
- Java IO与NIO的一些文件拷贝测试