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

android jni 学习笔记2

2010-04-29 17:27 369 查看
转自: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息