Ubuntu下JNI的实现与调用

      转载请注明出处http://blog.csdn.net/wudiwo/article/details/7571057

    反复研究技术的结果只有一个那就是让你感觉到它越来越简单。就像下面将要讲述的JNI的调用,刚开始接触的时候还感觉一头雾水,现在一切变的又是那样的清晰明朗。废话不多说,下面总结一下

 环境搭建 :

                  1、Ubuntu下关于JDK、SDK、NDK等的环境变量的配置不多少,这些都是最基本的东西,不大清楚问下谷歌或百度。

                  2、Eclipse 下进行的开发。

整个实现流程 :

              1、新建Android项目 HelloJni 并新建一个类 如下

  package com.fan.hellojni

  public class HelloJni extends Activity{

            private void onCreate(Bundle bundle){

                     super.onCreate(bundle);

                      LinearLayout lay=new LinearLayout(this);

                     setContentView(lay);

                    TextView tv=new TextView(this);

                      tv.setText(myJNI());// 这个是对JNI 本地方法的调用,当然这个要加载.so 之后

                    lay.addView(tv);

}

// 下面是重点

  private native String myJNI();

          static{

         System.loadLibrary("hello-jni.so");// 这个命名要和Android.mk保持一致

        }

}

               2、生成.h文件,.h文件主要是用来参考里面的方法名来编写.c 或者.cpp 文件。ubuntu 下打开终端,进入项目的calsses目录下,运行命令javah com.fan.hellojni.HelloJni   然后你会发现在calsses下面多了个com_fan_hellojni_HelloJni.h 的文件

               3、根据.h里面的方法名,编写.c   文件。直接拷贝方法名到.c 文件,然后在这个方法里面实现自己的功能。这里具体的内容不再给出因为项目不在跟前。有什么疑惑的可给我留言。

               4、在项目根目录下 新建jni目录,然后把.c 文件拷贝到该目录下面,还要新建一个Android.mk 文件,两个文件要放在一块,这是编译.so不可缺少的。

                5、在项目的根目录下 运行 ndk-build 

      compile thumb : hello-jni<=hello-jni.c
     sharedLibrary : libhello-jni.so
     Install :libhello-jni.so=> libs/armeabi/libhello-jni.so 

                出现上面的信息,恭喜你已经成功了

               Android.mk   文件主要配置一下几项内容:

 LOCAL_PATH :=$(call my-dir) //  一个Android.mk 文件必须定义的LOCAL_PATH变量。它用于在开发树中查找源文件。在这个例子中,宏函数“my-dri”由编译系统提供 ,用于返回当前的路径(即包含Android.mk file文件的目录)


 include $(CLEAR_VARS)        // CLEAR_VARS由编译系统提供,指定让GNU MAKEFILE为你清除许多LOCAL_XXX变量(例如 LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, 等等...), 除LOCAL_PATH 。这是必要的,因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有 的变量都是全局的。


 LOCAL_MODULE : hello-jni     // 编译的目标对象,LOCAL_MODULE变量必须定义,以标识你在Android.mk文件中描述的每个模块。名称必须是唯一的,而且不包含任何空格。


       注意:编译系统会自动产生合适的前缀和后缀,换句话说,一个被命名为'hello-jni'的共享库模块,将会生成'libhello-jni.so'文件。 重要注意事项:如果你把库命     名为‘libhello-jni’,编译系统将不会添加任何的lib前缀,也会生成libfoo.so,这是为了支持来源于Android平台的源代码的     Android.mk文件,如果你确实需要这么做的话。


   LOCAL_SRC_FILES : hello-jni.c  //LOCAL_SRC_FILES变量必须包含将要编译打包进模块中的C或C++源代码文件。注意,你不用在这里列出头文件和包含文件,因为编译系统将会自动为你找出依赖型的文件;仅仅列出直接传递给编译器的源代码文件就好。
 
  include $(BUILD_SHARED_LIBRARY)  //BUILD_SHARED_LIBRARY 表示编译生成共享库,是编译系统提供的变量,指向一个GNU Makefile脚本,负责收集自从上次调 用'include $(CLEAR_VARS)'以来,定义在LOCAL_XXX变量中的所有信息,并且决定编译什么,如何正确地去做。还有BUILD_STATIC_LIBRARY变量表示生成静态库:lib$(LOCAL_MODULE).a, BUILD_EXECUTABLE 表示生成可执行文件。

   

怎么样,简单吧!希望对你能有所帮助!?转载请注明出处http://blog.csdn.net/wudiwo/article/details/7571057


  

              

   

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值