Android JNI 调用 C/C++ 接口

Android 使用 NDK 原生支持调用 c/c++ 接口的代码,只需要在程序中按照 android jni 规范编程就可以直接使用。

C 语言版本

JNI 调用 c 语言相对简单,命名一个 jni 函数,系统会自动注册到 Java 虚拟机,然后 Java 代码里面可以直接调用:

Native 代码:

#include <jni.h>int add(int x, int y) {return x + y;}jintJava_com_example_android_simplejni_SimpleJNI_add( JNIEnv*  env,                                      jobject  this,                                      jint     x,                                      jint     y ){    return add(x, y);

需要注意的是函数名必须是跟 Java 类对应的,比如例子中的包为: package com.example.android.simplejni; 类名为: public class SimpleJNI

方法名为: add

然后 Java 类代码里面可以直接加载库,声明为自己的方法:

package com.example.android.simplejni;import android.app.Activity;import android.os.Bundle;import android.widget.TextView;public class SimpleJNI extends Activity {    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        TextView tv = new TextView(this);        System.loadLibrary("simplejni");        int sum = add(2, 3);        tv.setText("2 + 3 = " + Integer.toString(sum));        setContentView(tv);    }    public native int add(int  x, int  y);}

C++ 版本

c++ 语言由于跟 Java 一样是面向对象的设计语言,具有更多的特性,只是传递函数就不需要 c++ 了。 那么使用 C++ 代码注册到 Java 虚拟机就相对麻烦一些。

需要手动注册方法: 直接给 代码 吧:development/samples/SimpleJNI/jni/native.cpp

#define LOG_TAG "simplejni native.cpp"#include <utils/Log.h>#include <stdio.h>#include "jni.h"static jintadd(JNIEnv *env, jobject thiz, jint a, jint b) {int result = a + b;    ALOGI("%d + %d = %d", a, b, result);    return result;}static const char *classPathName = "com/example/android/simplejni/Native";static JNINativeMethod methods[] = {  {"add", "(II)I", (void*)add },};/* * Register several native methods for one class. */static int registerNativeMethods(JNIEnv* env, const char* className,    JNINativeMethod* gMethods, int numMethods){    jclass clazz;    clazz = env->FindClass(className);    if (clazz == NULL) {        ALOGE("Native registration unable to find class '%s'", className);        return JNI_FALSE;    }    if (env->RegisterNatives(clazz, gMethods, numMethods) < 0) {        ALOGE("RegisterNatives failed for '%s'", className);        return JNI_FALSE;    }    return JNI_TRUE;}/* * Register native methods for all classes we know about. * * returns JNI_TRUE on success. */static int registerNatives(JNIEnv* env){  if (!registerNativeMethods(env, classPathName,                 methods, sizeof(methods) / sizeof(methods[0]))) {    return JNI_FALSE;  }  return JNI_TRUE;}// ----------------------------------------------------------------------------/* * This is called by the VM when the shared library is first loaded. */ typedef union {    JNIEnv* env;    void* venv;} UnionJNIEnvToVoid;jint JNI_OnLoad(JavaVM* vm, void* reserved){    UnionJNIEnvToVoid uenv;    uenv.venv = NULL;    jint result = -1;    JNIEnv* env = NULL;        ALOGI("JNI_OnLoad");    if (vm->GetEnv(&uenv.venv, JNI_VERSION_1_4) != JNI_OK) {        ALOGE("ERROR: GetEnv failed");        goto bail;    }    env = uenv.env;    if (registerNatives(env) != JNI_TRUE) {        ALOGE("ERROR: registerNatives failed");        goto bail;    }        result = JNI_VERSION_1_4;    bail:    return result;}

Java :SimpleJNI/src/com/example/android/simplejni/SimpleJNI.java

package com.example.android.simplejni;import android.app.Activity;import android.os.Bundle;import android.widget.TextView;public class SimpleJNI extends Activity {    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        TextView tv = new TextView(this);        int sum = Native.add(2, 3);        tv.setText("2 + 3 = " + Integer.toString(sum));        setContentView(tv);    }}class Native {    static {    // The runtime will add "lib" on the front and ".o" on the end of    // the name supplied to loadLibrary.        System.loadLibrary("simplejni");    }    static native int add(int a, int b);}



更多相关文章

  1. C语言函数的递归(上)
  2. Qt on Android(安卓)Episode 5(翻译)
  3. Android(安卓)NDk 开发简易教程
  4. Android第十三期 - 百度云推送(百度后台版)
  5. 安卓自动生成代码插件-Android(安卓)code Generator
  6. Android(安卓)使用Rtmp音视频推流
  7. 浅谈 MVP in Android
  8. 史上最全的Android文章精选合集
  9. Mac和Windows上Android(安卓)Studio常用的快捷键

随机推荐

  1. android中的ellipsize
  2. Android系统服务-简介
  3. 基于Android平台的物联网网关方案设计
  4. Android(安卓)L之 VectorDrawable
  5. Android三种动画详解
  6. 【Android(安卓)Dev Guide - 03】 - Cont
  7. Android通知栏的变化
  8. Android(安卓)ThreadLocal 源码分析
  9. 《Android(安卓)Dev Guide》系列教程7:And
  10. Android布局——Linearlayout线性布局