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

http://blog.chinaunix.net/uid-7922708-id-3043552.html

练习:从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 文件编写) 

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 文件编写) 

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 文件中的内容如下: 
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()+"");  
    }  
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
框架说白了就是JAVA工作者多年以来总结出的一些开发标准。让我们可以以成功的经验模式来开发我们自已的系统,一般使用框架的好处是 ·在好的框架下,开发者只需要写一些必须的代码;他们不需要直接接触底层的API。 这一点很重要。 ·经过良好设计的框架可以为程序提供清晰的结构并且提高程序的内聚性。好清晰的结构使得其他人可以更容易加入项目。 ·一个容易使用的框架可以通过一些例子和文档为用户提供最佳实践。 ·采用成功的框架的代码比自己的代码容易测试 J2EE本身提供了一些框架。比如, Enterprise Java-Beans (EJB) container或者 Servlet engine 而这些框架一般在中小工程中我们都不会使用,会让我们把大量的时间浪费在开发框架上。 而现在比较流行开源框架,主要是struts,hibernate,spring等 比如struts是在原有mvc基础上实现在代码分离等功能,非常好用。 而hibernate可以把我们的关系型数据库转换成我们在JAVA中的面像对像来使用。从而让我们在开发时不需要直接写SQL语句,比如database.getName();就可以直接把数据库中的用户名取出来。 Spring J2EE框架被大规模地运用到项目中,而项目总要负责这些框架以及自己业务代码的连接,使之真正融合到一起。Spring就是专注于这个问题的,它和Hibernate融合的很好。 这三种框架在一起并不冲突,所以现在最常用的框架就是 struts+hibernate+spring就像我们盖房子一样,先把框架搭好,我们在在上面写代码就很规范。 Struts框架介绍 : Struts只是一个MVC框架(Framework),用于快速开发Java Web应用。Struts实现的重点在C(Controller),包括ActionServlet/RequestProcessor和我们定制的 Action,也为V(View)提供了一系列定制标签(Custom Tag)。但Struts几乎没有涉及M(Model),所以Struts可以采用JAVA实现的任何形式的商业逻辑。 Spring是一个轻型容器(light-weight container),其核心是Bean工厂(Bean Factory),用以构造我们所需要的M(Model)。在此基础之上,Spring提供了AOP(Aspect-Oriented Programming, 面向层面的编程)的实现,用它来提供非管理环境下申明方式的事务、安全等服务;对Bean工厂的扩展ApplicationContext更加方便我们实 现J2EE的应用;DAO/ORM的实现方便我们进行数据库的开发;Web MVC和Spring Web提供了Java Web应用的框架或与其他流行的Web框架进行集成。 就是说可将两者一起使用,达到将两者自身的特点进行互补。 spring 框架介绍 : 它关注的领域是其他许多流行的Framework未曾关注的。Spring要提供的是一种管理你的业务对象的方法。 Spring既是全面的又是模块化的。Spring有分层的体系结构,这意味着你能选择仅仅使用它任何一个独立的部分,而它的架构又是内部一致。 因此你能从你的学习中,得到最大的价值。例如,你可能选择仅仅使用Spring来简单化JDBC的使用,或用来管理所有的业务对象。 它的设计从一开始就是要帮助你编写易于测试的代码。Spring是使用测试驱动开发的工程的理想框架。 Spring不会给你的工程添加对其他的框架依赖。Spring也许称得上是个一站式解决方案,提供了一个典型应用所需要的大部分基础架构。它还涉及到了其他framework没有考虑到的内容。 尽管它仅仅是一个从2003年2月才开始的开源项目,但Spring有深厚的历史根基。 Spring架构上的好处 在我们进入细节之前,让我们来看看Spring能够给工程带来的种种好处: Spring能有效地组织你的中间层对象,不管你是否选择使用了EJB。如果你仅仅使用了Struts或其他为J2EE的 API特制的framework,Spring致力于解决剩下的问题。 Spring能消除在许多工程中常见的对Singleton的过多使用。根据我的经验,这是一个很大的问题,它降低了系统的可测试性和面向对象的程度。 通过一种在不同应用程序和项目间一致的方法来处理配置文件,Spring能消除各种各样自定义格式的属性文件的需要。曾经对某个类要寻找的是哪个 魔法般的属性项或系统属性感到不解,为此不得不去读Javadoc甚至源编码?有了Spring,你仅仅需要看看类的JavaBean属性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值