什么是JNI?

JNI java本地开发接口
JNI 是一个协议
这个协议用来沟通java代码和外部的本地代码(c/c++).
通过这个协议,java代码就可以调用外部的c/c++代码
外部的c/c++代码也可以调用java代码

环境搭建完毕......开始第一个JNI程序咯..╮(╯_╰)╭必写的HelloWorld.

第一步:
首先创建一个普通的android工程:






















第二步:

我们声明2个方法,一个名称是不带下划线的,一个名称带下划线的
//native方法就是告诉虚拟机,这个方法由本地的代码实现。现在在windows下实现,就是dll了。
public native String getHelloString(); //声明
public native String get_Hello_String();//声明

第三步:

在项目根目录下创建一个jni目录:

在jni目录下创建两个文件:Android.mk和Hello.c.

(Android.mk编译文件是用来向Android NDK描述你的C,C++源代码文件的;

Hello.c c的源文件.我们主要在这个文件里做实现;)

Android.mk里面该怎么写呢?我们去看下NDK文档(我的路径F:\ndk\android-ndk-r7b\docs\ANDROID-MK.html):

把下面的代码复制到我们的Android.mk里面:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello-jni
   LOCAL_SRC_FILES := hello-jni.c

include $(BUILD_SHARED_LIBRARY)

然后把hello-jni改成Hello   和hello-jni.c改成Hello.c


说明(具体请百度Android.mk语法):

LOCAL_PATH := $(call my-dir)它用来在你的工程树形目录下定位你的资源文件的位置。那个编译系统提供的“my-dir”宏函数用来返回当前目录的路径(Android.mk文件所在的目录)

LOCAL_MODULE 是定义模块的名字

注意,编译系统会给相应的生成文件自动地添加适当的前缀和后缀。换句话说,一个命名为“Hello”的共享库module将生成名为“libHello.so”的文件。

如果你的模块命名为“libHello”,编译系统不会为你添加另外一个“lib”前缀,还是会生成一个“libHello.so”的文件而已。

LOCAL_SRC_FILES变量必须包含一个将要被编译和汇编进module的一个C/C++资源文件列表

include $(BUILD_SHARED_LIBRARY)编译出的是动态库

Hello.c代码如下:

#include <stdio.h>
#include <jni.h> jstring Java_com_pl_demo1_MainActivity_getHelloString(JNIEnv* env,jobject obj){ return (*(*env)).NewStringUTF(env,"1.hello world!");
} jstring Java_com_pl_demo1_MainActivity_get_1Hello_1String(JNIEnv* env,jobject obj){
return (*env)->NewStringUTF(env,"2.__hello___!");
}

jni.h头文件可以具体去看看内容.

(严格区分大小写)

返回值 Java_包名_类名_方法名(JNIEnv* env,jobject obj)

两个参数先用吧 暂时不说明用途

带下划线的方法名和普通的区别是 在下划线后面添加一个1

第四步:打开Cygwin进入到项目根目录执行ndk-build:

cygdirve是计算机的根目录

f是我的盘符

我的项目是在F:\summerVacation\ndkhelloworld

像上图情况表示已经搞定了。下面我们去项目中看看 (刷新一下项目):

第五步:

在MainActivity.java里实现静态代码块里加载动态链接库(去掉libHello.so前缀和后缀):

static{
System.loadLibrary("Hello");//加载动态链接库(把二进制库文件加载到java虚拟机里)
}

第六步:

在layout布局里面定义个Button并激活点击事件:

main.xml

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<Button
android:id="@+id/bt_c_hello"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="连接底层c动态链接库"
/>
</LinearLayout>

MainActivity.java

package com.pl.demo1;

import com.example.ndkhelloworld.R;

import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast; public class MainActivity extends Activity implements OnClickListener {
private Button bt_c_hello;
static{
System.loadLibrary("Hello");//加载动态链接库(把二进制库文件加载到java虚拟机里)
}
//ative方法就是告诉虚拟机,这个方法由本地的代码实现。现在在windows下实现,就是dll了。
public native String getHelloString(); //声明
public native String get_Hello_String();//声明
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bt_c_hello = (Button) findViewById(R.id.bt_c_hello);
bt_c_hello.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(),"普通的方法名:"+getHelloString(),Toast.LENGTH_SHORT).show();
Toast.makeText(getApplicationContext(),"第二个方法名带_:"+get_Hello_String(),Toast.LENGTH_SHORT).show();
}
}

好了 点击界面的按钮调用native声明的方法就会调用c的Hello.c的函数

源码下载地址:http://download.csdn.net/detail/pl83447876/6572641

手写Hello.c函数容易出错,所以我们用:
Javah生成JNI头文件

JNI之HelloWorld的更多相关文章

  1. Android开发之JNI(一)--HelloWorld及遇到的错误解析

    Android开发之JNI(一)--HelloWorld及遇到的错误解析 1.NDK环境搭建    參考http://blog.csdn.net/xiaoliouc/article/details/8 ...

  2. 一个JNI的helloworld小demo

    最近想学习一下jni,在网上看了一些demo,自己也操作了一遍,首先我将我自己学习的demo网站贴出来:https://blog.csdn.net/lwcloud/article/details/78 ...

  3. JNI简单HelloWorld

    1.编写Java代码 建立hello目录,编写HelloWorld.java: class HelloWorld { public native void displayHelloWorld(); s ...

  4. IntelliJ IDEA平台下JNI编程—HelloWorld篇

    转载请注明出处:[huachao1001的专栏:http://blog.csdn.net/huachao1001/article/details/53906237] JNI(Java Native I ...

  5. jni 之helloworld

    前言:     作为android开发程序员,有的时候不得不和c,c++进行交互,有时候,需要把自己的应用加入一些特效,2d的或者3d的,特别是立志或者想要转向android游戏开发(目前所知,coc ...

  6. java native方法及JNI实例 (转)

    转自:http://blog.csdn.net/xw13106209/article/details/6989415 1.参考文献: http://blog.csdn.net/youjianbo_ha ...

  7. java native方法与JNI实现

    native方法定义: 简单地讲,一个Native Method就是一个java调用非java代码的接口.一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如 ...

  8. 基于 Android NDK 的学习之旅-----HelloWorld

    Hello World作为所有编程语言的起始阶段,占据着无法改变的地位,所有中/英/法/德/美……版本的编程教材中,hello world总是作为第一个TEST记录于书本之中,所有的编程第一步就在于此 ...

  9. JNI小记

    本文参考<较详细的介绍JNI>一文,并添加了一些方法,代码已经过测试,留待日后工作使用.关于JNI的HelloWorld的例子,就不赘述了. java代码: 1 package com.c ...

随机推荐

  1. Hadoop MultipleOutputs 结果输出到多个文件夹 出现数据不全,部分文件为空

    如题:出现下图中的情况(设置reduceNum=5) 感觉很奇怪,排除了很久,终于发现是一个第二次犯的错误:丢了这句 this.mOutputs.close(); 加上这句,一切恢复正常!

  2. 怪兽z主机标准版视频测试。

    我的淘宝店很早就开张了,但是一直没有好好打理,这次给大家带来的是本店所售一款主机的视频测试. CPU:AMD -A10 6700 主板:映泰Hi-Fi A88S3E 内存条:正品金士顿骇客游戏神条 机 ...

  3. 帝国cms7.0调用出栏目下的东西

    打开帝国后台,新建一个栏目,简历一个封面模板为 abc,套用一个封面栏目. [e:loop={"select * from {$dbtbpre}enewsclass where classi ...

  4. C++模板:二分图匹配

    int Dfs(int k){ for(int i=0;i<v[k].size();i++){ int a=v[k][i]; if(used[a]==0){ used[a]=1; if(link ...

  5. C功底挑战Java菜鸟入门概念干货(二)

    (接上篇博文:C功底挑战Java菜鸟入门概念干货(一)) 一.Java面向对象程序设计-类的基本形式 1.“类”是把事物的数据与相关的功能封装在一起,形成的一种特殊结构,用以表达对真实世界的一种抽象概 ...

  6. [dfs+水] hdu 4462 Scaring the Birds

    题意: N*N的矩阵中有M个点能够放稻草人.且给覆盖距离R 每一个稻草人能覆曼哈顿距离R以内的点 问最少须要多少个稻草人 思路: 由于范围非常小,直接能够暴力 注意稻草人所在的位置是不须要被覆盖的 代 ...

  7. poj 3335 Rotating Scoreboard - 半平面交

    /* poj 3335 Rotating Scoreboard - 半平面交 点是顺时针给出的 */ #include <stdio.h> #include<math.h> c ...

  8. ofbiz学习笔记

    最新稳定版apache-ofbiz-13.07.02 最新源码ofbiz-release14.12 ant load-demo 载入演示样例数据 ant load-seed 仅仅载入种子数据 ant ...

  9. 【从0開始Tornado建站】群聊

    群聊的前台主要代码: {%block content%} <!--<p class='text-success h3'>測试版本号,每天凌晨4:00清水,enjoy it~~:-)& ...

  10. iOS开发常识

    一.NSString 创建字符串.  NSString *astring = @"This is a String!"; 创建空字符串,给予赋值.  NSString *astri ...