首页 技术 正文
技术 2022年11月15日
0 收藏 704 点赞 3,282 浏览 2530 个字

转自:  http://www.eoeandroid.com/forum.php?mod=viewthread&tid=264543&fromuid=588695

昨天已经简要介绍了JNI,今天用代码来实现JNI的实现过程,并同各们交流各自心得,有不当之处还请客气地批评二、Android NDK编程预备之Java jni入门Hello World
       实现过程主要是以昨天介绍的从Java调用C/C++的六个步骤
            1. 编写java代码(Hello World)
       在Eclipse中新建项目Hello World,首先我们需要编写自己的java代码,在java代码中我们会声明native方法,代码非常简单。如下所示

代码片段,双击复制
01020304050607080910111213 package com.jackie.jni; public class HelloWorld {        public native void displayHelloWorld();         static {                System.loadLibrary("HelloWorld");        }         public static void main(String[] args) {                new HelloWorld().displayHelloWorld();        }}

注意:displayHelloWorld()方法的声明,它有一个关键字native,表明这个方法使用java以外的语言实现。方法不包括实现,因为要用c/c++语言实现它。注意System.loadLibrary(“HelloWorld”)这句代码,它是在静态初始化块中定义的,系统用来装载hello共享库,这就是在后面生成的HelloWorld.dll(如果在其他的操作系统可能是其他的形式,比如在Linux中是HelloWorld.so)
          2.编译Java代码:
       这一步Eclipse或其它IDE已帮我们做了,自己编译的形式是:javac 包名.HelloWorld.java,所以我的项目手动编译应为:javac com.jackie.jni.HelloWorld.java 生成相应包下的HelloWorld.class文件
          3.创建C/C++的.h文件头
       这一步中要使用javah命令生成.h文件,其使用方法如下:
                    javah <包含以native关键字声明的方法的 包名.Java类名称>
      本项目的方法是在dos窗口切换至项目主目录输入:javah -classpath bin com.jackie.jni.HelloWorld。在项目主目录下生成了com_jackie_jni_HelloWorld.h文件内容如下:

代码片段,双击复制
010203040506070809101112131415161718192021 /* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_jackie_jni_HelloWorld */ #ifndef _Included_com_jackie_jni_HelloWorld#define _Included_com_jackie_jni_HelloWorld#ifdef __cplusplusextern "C" {#endif/* * Class:     com_jackie_jni_HelloWorld * Method:    displayHelloWorld * Signature: ()V */JNIEXPORT void JNICALL Java_com_jackie_jni_HelloWorld_displayHelloWorld  (JNIEnv *, jobject); #ifdef __cplusplus}#endif#endif

在此对这个.h文件作个简要的说明:每一个native声明的方法都有一个Java_类名_包名(其中的”.”以”_”替换)_方法名与这对应
            4.编写C/C++代码
       在这部分要用C/C++语言实现java中定义的方法,我们在VC++中新建一个Project,然后创建一个HelloWorld.cpp文件,内容如下

代码片段,双击复制
01020304050607080910 #include <jni.h>#include "com_jackie_jni_HelloWorld.h"#include <stdio.h> JNIEXPORT void JNICALLJava_com_jackie_jni_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj){    printf("Hello world!\n");    return;}

5.创建共享库文件
       这个VC++也以帮我们做了,注意我们这里include了 jni.h和刚才得到的”com_jackie_jni_HelloWorld.h文件。因此你要在VC++里面设置好,jni.h在JAVA_HOME/include里面。编译通过后再生成HelloWorld.dll文件。
          6.运行Java程序
       把上面生成的hello.dll文件复制到我们的工作目录,这时候我们的目录中包括HelloWorld.java,HelloWorld.class和HelloWorld.dll文件。运行java HelloWorld命令,则可在控制台看到Hello world!的输出了。(HelloWorld.class和HelloWorld.dll文件必须在同一包目录下面)

一、Android NDK编程预备之Java jni简介:http://www.eoeandroid.com/thread-264384-1-1.html
三、Android NDK编程预备之Java jni入门创建C/C++共享库: http://www.eoeandroid.com/thread-264971-1-1.html

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,487
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,903
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,736
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,487
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,127
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,289