`
anson_xu
  • 浏览: 512988 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类

一个打通jni,java framework,application三层的练习

阅读更多

转自:http://blogold.chinaunix.net/u4/123238/showart_2513848.html  非常感谢

一个打通jni,java framework,application三层的练习

 
 

一个打通jni,java framework,application三层的练习

Daniel Wood 08/27/2010

写在前面的话:

   这篇文章很早就发表在我自己原先的那个blog中,因为忍受不了原先blog的乱码问题所以才在这里开了这个blog,现在把它正式地移到这个blog上来,不要说我抄袭哦^-^。

 

练习:从jni层获得一个字符串,在屏幕上显示,当然是手机屏幕

要求:
1.需要包含三层结构:JNI, java framework, java application
2.字符串的内容为“Hello from JNI !”,必须在JNI层定义

这个练习是在Android的源码工程下做的,我的Android源代码路径为/Android/android-1.6_r2

开工:

1.  JNI :在 /Android/android-1.6_r2/frameworks/base/core/jni 路径下创建例子 android_mytest_hellojni.cpp 文件,这个文件就是在 JNI 层实现接口。文件内容如下:(可参考同一目录下的 android_debug_JNITest.cpp 文件编写)

# define LOG_TAG "HelloJNI"
# include "jni.h"
# include "nativehelper/JNIHelp.h"
# include "utils/Log.h"
# include "utils/misc.h"

namespace android {
static jstring android_mytest_hellojni_displayString( JNIEnv * env, jclass clazz)
{
 return env- > NewStringUTF( "Hello from JNI!" ) ;
}

/*
 * JNI registration.
 */

static JNINativeMethod gMethods[ ] = {
    /* name, signature, funcPtr */
    { "displayString" , "()Ljava/lang/String;" ,
            ( void * ) android_mytest_hellojni_displayString } ,
    
} ;
int register_android_mytest_hellojni( JNIEnv* env)
{ //此处的目录结构就是在Javaframework层的文件目录,且必须一致

return jniRegisterNativeMethods( env, "android/mytest/hellojni" ,
        gMethods, NELEM( gMethods) ) ;
}
} ;

2. JNI 层:对编译的修改配置

  2.1修改/Android/android-1.6_r2/frameworks/base/core/jni目录下的Android.mk 文件,在LOCAL_SRC_FILES:= \ 下面加上
android_mytest_hellojni.cpp \
   2.2修改/Android/android-1.6_r2/frameworks/base/core/jni目录下的AndroidRuntime.cpp 文件在extern int 后面添加
extern int register_android_mytest_hellojni(JNIEnv* env);
然后在static const RegJNIRec gRegJNI[] = {下面添加
REG_JNI(register_android_mytest_hellojni),
这样,JNI层的修改就到此为止了。

 

3.   Javaframework 层:在 /Android/android-1.6_r2/frameworks/base/core/java/android/ 新建文件目录 mytest ,在该目录下新建文件 hellojni.java 声明接口。内容如下:(可以参考 android-1.6_r2/frameworks/base/core/java/android/debug 目录下的 JNITest.java 文件编写)

package android. mytest;
public class hellojni{
    public hellojni( ) { }
//此处声明为public所以才可以被application调用

    public static native String displayString( ) ;
}

4 .下面我们要对我们做过更改的 libandroid_runtime.so framework.jar 进行重新编译。

在源代码工程目录下输入 make libandroid_runtime 重新编译生成 libandroid_runtime.so

target thumb C++: libandroid_runtime <= frameworks/base/core/jni/android_mytest_hellojni.cpp

target thumb C++: libandroid_runtime <= frameworks/base/core/jni/AndroidRuntime.cpp

target SharedLib: libandroid_runtime (out/target/product/generic/obj/SHARED_LIBRARIES/libandroid_runtime_intermediates/LINKED/libandroid_runtime.so)

target Prelink: libandroid_runtime (out/target/product/generic/symbols/system/lib/libandroid_runtime.so)

target Strip: libandroid_runtime (out/target/product/generic/obj/lib/libandroid_runtime.so)

Install: out/target/product/generic/system/lib/libandroid_runtime.so

然后再输入 make framework 重新编译生成 framework.jar

Install: out/target/product/generic/system/framework/framework.jar

5.   然后在 eclipse 里面或者在记事本等编辑器(这么说只是为了说明只需要源代码),新建 Android project ,例子的结构如下:

testApp.java 文件中的内容如下:

package com. integration. test;
import android. app. Activity ;
import android. os. Bundle;
import android. widget. TextView;
//需要import自己定义的包,包名可以根据文件目录结构得到


import android. mytest. hellojni;
public class testAPP extends Activity {
    /** Called when the activity is first created. */
    private TextView tv;
    @Override
    public void onCreate( Bundle savedInstanceState) {
        super . onCreate( savedInstanceState) ;
        setContentView( R. layout . main) ;
        tv = ( TextView) findViewById( R. id . tv) ;
        hellojni hello = new hellojni( ) ; //调用自己写的JNI

        tv. setText ( hello. displayString( ) + "" ) ;
    }
}

然后将上述文件复制到 /Android/android1.6_r2/packages/apps ,然后看教程《在源码中编译自己的 Android project 》就可以在模拟器中看到该应用运行如下图:

分享到:
评论

相关推荐

    JNI(Java Native Interface)中文手册

    - **兼容性**:由于JNI是一个标准接口,因此一旦实现了某个本地库与Java之间的交互,这一实现通常可以在不同的Java平台上复用。 #### 四、JNI的组成部分 根据文档描述,本书主要分为以下几个部分: - **第二章**...

    JAVA通过JNI调用C#dll的整个项目工程

    Java通过JNI调用C# DLL是一个跨平台、跨语言的技术实践,主要应用于需要利用Java的稳定性和C#的高性能场景。JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。C# ...

    java jni 传递结构体

    文档里描述了如何通过jni方法在java与c++代码之间传递非基本类型数据

    JNI创建java对象

    首先,要使用JNI创建Java对象,你需要定义一个Java类并添加本地方法声明。例如: ```java public class MyJavaObject { static { System.loadLibrary("mynative"); // 加载本地库 } public native void ...

    Java再说JNI之实例

    Java再次探讨JNI(Java Native Interface)这一主题,其主要目的是为了解决Java语言与本地代码交互的问题。JNI在Java世界中扮演着重要角色,它允许Java程序调用C/C++等本地代码,反之亦然,使得Java应用可以利用底层...

    delphi通过JNI调用JAVA函数

    当我们需要在Delphi项目中利用Java的功能时,JNI(Java Native Interface)成为了一座桥梁,使得两者能够相互调用。本篇将深入探讨如何在Delphi中通过JNI来调用Java函数。 首先,我们需要理解JNI的概念。JNI是Java...

    一个简单的JNI实验

    这个"一个简单的JNI实验"是一个实践教程,旨在帮助初学者理解如何在Java程序中调用本地(非Java)代码,比如C或C++。下面我们将详细探讨JNI的相关知识点。 1. **JNI的基本概念**: JNI是Java平台提供的一种机制,...

    java jni简单实例

    本资源提供的“java jni简单实例”是一个实际应用JNI的示例,有助于学习和理解JNI的工作原理。 首先,我们来看JNI的核心概念: 1. **本地方法接口**:JNI定义了一套接口,使得Java代码能够声明本地方法(即非Java...

    jni java传递对象到C

    在Java编程中,JNI(Java Native Interface)是一个关键的组件,它允许Java代码与其他语言(如C和C++)进行交互。当我们需要高效地处理数据、利用特定平台的库或者优化性能时,JNI就显得尤为重要。本文将深入探讨...

    JNI开发Java和C/C++互相传递List集合

    JNI开发Java和C/C++互相传递List集合, 可以参考: Java从C/C++获取List集合对象:https://blog.csdn.net/niuba123456/article/details/80994166 Java传递List集合对象到C/C++ ...

    androidjni编程,java和c层的互相通信传递数据

    Android JNI(Java Native Interface)编程是Android开发中的一个重要部分,它允许Java代码和其他语言(如C/C++)编写的代码进行交互。JNI在Android平台上扮演着桥梁的角色,使得开发者能够利用C/C++的强大性能和...

    Android C、Java、JNI效率测试结果.doc

    Android 操作系统中,效率测试是一个非常重要的方面,特别是在使用 JNI(Java Native Interface)调用 C 语言时。这个文档描述了 Android G1 环境中,C、Java、JNI 调用(C 调 Java、Java 调 C)基本运算、方法调用...

    Android JNI native调用 java层demo TESTJNI.zip

    在Android开发中,JNI(Java Native Interface)是一个关键的组件,它允许Java代码与其他语言写的代码进行交互,尤其是C和C++。JNI在许多场景下非常有用,例如优化性能、利用硬件特性、接入第三方库等。本文将深入...

    Delphi10.3 中通过JNI调用 Java 函数

    JNI是Java平台的一部分,它为Java代码与其他语言编写的代码提供了一个标准接口。通过JNI,开发者可以在Java应用程序中调用C、C++甚至是其他语言编写的原生代码,反之亦然。在Delphi中调用Java函数,可以利用JNI提供...

    jni4net C# java 相互调用

    这个库基于JNI(Java Native Interface),是Java平台上的一个标准机制,用于在Java代码和本地(非Java)代码之间建立桥梁。而jni4net则为.NET Framework提供了这样的桥接,使得C#应用程序能够无缝地与Java应用进行...

    visual studio 2019下C++通过JNI调用JAVA代码

    JNI是Java平台的一部分,它为Java应用程序提供了与本地代码交互的能力,使得开发者可以将Java应用与C/C++库无缝结合。 首先,我们需要确保已经安装了以下组件: 1. Visual Studio 2019:这是我们的开发环境,支持...

    jni回调Java层函数示例

    NI是Java Native Interface的缩写,是Java平台的重要特性,使得Java代码可以方便地与C/C++代码...本文主要给出一份示例代码(工程文件见附件),描述如何在Android的JNI层开启一个线程,并在线程中回调Java层的函数。

    jni java delphi调用

    Java和Delphi之间的交互主要通过Java Native Interface (JNI) 实现,这是一种允许Java代码调用本地(非Java)代码的框架。JNI在跨平台应用程序开发中扮演着重要角色,特别是当需要利用特定平台的库或者优化性能时。...

    Qt for Android 用JNI来使C++和Java互调(目前最新版全网只有这个可用)

    JNI是Java平台的一部分,它允许Java代码调用本地(非Java)代码,反之亦然。在Qt for Android中,我们可以通过JNI来调用C++编写的Qt函数,或者在C++代码中调用Android的API,实现对设备硬件和特定平台功能的访问。 ...

    如何利用JNI实现Java插件开发

    JNI在Java与本地代码之间提供了一个桥梁,使得Java可以调用本地库中的函数,同时也允许本地代码实例化Java对象并调用其方法。 #### 二、背景与目标 本文的主要目标是通过JNI技术来实现在Java应用程序中调用已有的...

Global site tag (gtag.js) - Google Analytics