转自:http://wallage.blog.163.com/blog/static/17389624201032155546521/

JNI 是Java Native Interface。
Java Native Interface (JNI)标准成为java平台的一部分,
它允许Java代码和其他 语言写的代码进行交互。
JNI 是本地编程接口。它使得在 Java 虚拟机 (VM) 内部运行的 Java 代码
能够与用其它编程语 言(如 C、C++ 和汇编语言)编写的应用程序和库进行互操作。

下面就是我在 Android 环境中一个Test JNI 的代码。
1.
// TestNativeApi.java
// Native程序,编译成jar包形式,被上层java应用调用。
// static 函数中调用 android System.loadLibrary() 来调用 .so 库,
// loadLibrary()会判断 .so库的类型,如果是jni库,则会调用 .so库中的 JNI_OnLoad()函数来注册jni interface.

package com.me.test;

import android.util.Log;

public final class TestNativeApi {

static {
try {
System.loadLibrary("itest_jni");
} catch (UnsatisfiedLinkError e) {
Log.d("itest_jni", "itest jni library not found!");
}
}

/**
* This class is uninstantiable.
*/
private TestNativeApi() {
// This space intentionally left blank.
}

public native static int apiFunction();

}

// Android.mk for TestNativeApi.java
// 通过函数 BUILD_JAVA_LIBRARY 编译成jar.

# Build com.me.test.jar
# ============================================================

test_dirs := /
./test/java/com/me/test

test_src_files := $(call all-java-files-under,$(cm_dirs))

# ==== the library =========================================
include $(CLEAR_VARS)

LOCAL_SRC_FILES := $(test_src_files)

LOCAL_NO_STANDARD_LIBRARIES := true
LOCAL_JAVA_LIBRARIES := core framework

LOCAL_MODULE := com.me.test

include $(BUILD_JAVA_LIBRARY)


2.
// TestInternalApi.cpp
// JNI interface class, JNI_OnLoad()函数在.so被load的时候调用
// JNI interface function中可以调用底层的 C++/C函数控制硬件等

#define LOG_TAG "itest_jni"
#include <utils/misc.h>
#include <utils/Log.h>
#include "jni.h"
#include "JNIHelp.h"
#include "android_runtime/AndroidRuntime.h"
#include "scm_dbus_utils.h"

#define INTERNALAPI_PKG_NAME "com/me/test/TestNativeApi"

using namespace android;

static jint test_TestInterAPI_Func(JNIEnv* env, jobject clazz)
{
jint ret = (jint)0;

LOGD("call /"%s/"", __FUNCTION__);
return ret;
}

/*
* JNI registration.
*/

static JNINativeMethod gTestInterApiMethods[] = {
{ "apiFunction", "()I", (void *)test_TestInterAPI_Func }
};

int register_com_me_test_TestInternalApiNative(JNIEnv *env)
{
return AndroidRuntime::registerNativeMethods(env, INTERNALAPI_PKG_NAME, gTestInterApiMethods, NELEM(gTestInterApiMethods));
}

jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
JNIEnv* env = NULL;
jint result = -1;

LOGD("TestInteralApi JNI loaded");

if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
LOGE("GetEnv failed");
goto bail;
}
assert(env != NULL);

if (register_com_me_test_TestInternalApiNative(env) < 0) {
LOGE("TestInternalApi native registration failed");
goto bail;
}

result = JNI_VERSION_1_4;

bail:
return result;
}


// Android.mk for TestInternalApi.cpp
// 通过函数 BUILD_SHARED_LIBRARY 编译成 .so .

include $(CLEAR_VARS)

ifeq ($(TARGET_ARCH), arm)
LOCAL_CFLAGS += -DPACKED="__attribute__ ((packed))"
else
LOCAL_CFLAGS += -DPACKED=""
endif

LOCAL_SRC_FILES:= /
TestInternalApi.cpp

LOCAL_C_INCLUDES += /
$(JNI_H_INCLUDE)

LOCAL_SHARED_LIBRARIES := /
libandroid_runtime /
libnativehelper /
libcutils /
libutils /
libdvm

LOCAL_MODULE:= libitest_jni

include $(BUILD_SHARED_LIBRARY)

endif


本 文来自CSDN博客,转载请标明出处:http://blog.csdn.net/stevenliyong/archive/2009/11/25/4870204.aspx

更多相关文章

  1. 三种形式的hello world
  2. Android(安卓)Service的生命周期2
  3. android录音功能的实现
  4. Android(安卓)Binder分析三:Natvie Service的获取和调用
  5. Android修改源代码控制永不锁屏
  6. android为ImageView使用蒙层
  7. Android(安卓)savedInstanceState的作用和用法
  8. Android(安卓)O Launcher3-Workspace加载
  9. Android系统启动之配置文件解析

随机推荐

  1. 世界上没有绝对安全的手机,保护iPhone安全
  2. OSPF学习笔记整理(中)
  3. Gookit Banking Trojan中的后门利用分析
  4. CCIE考试中常用的show,赶紧收藏吧!
  5. 信息安全行业的门槛有多高?安全行业个人职
  6. 【原创】关于交换机端口链路类型Access、
  7. 3分钟掌握思科路由器密码破解
  8. 【原创】关于交换机端口链路类型Access、
  9. CVE-2019-16097 Harbor权限提升漏洞分析
  10. 商业电子邮件诈骗损失已达260亿美元!如何