android学习之jni编程初探

使“java+c”的开发方式成为了官方支持的开发方式,NDK的本质就是为了让Android应用程序能方便的使用JNI技术而提供的一套工具集合,使用NDK主要是4大好处,第一个,代码的保护,,由于apk的java层代码很容易被反编译,而c/c++反汇编难度较大;第二个,可以很方便的使用开源库,因为很多的现存的开源库都是c/c++代码编写的;第三个,提高程序的执行效率,第四个,便于移植,使用c/c++写的库可以方便在其它的嵌入式平台上使用.这里还有一个问题就是如果在模拟器上运行的话,我们只能在ARM上运行,并不能在intel上运行,否则会无法加载那个so库文件

NDK环境搭建

第一步:下载NDK

第二步:创建一个Android工程

第三步:在该工程目录的根目录下创建一个jni目录,用来作为ndk的编译路径(NDK的脚本会根据jni目录中的c/c++文件以及mk文件进行编译生成so文件)

第四步:创建builder(builder会使用ndk中的工具将jni目录中的文件编译成为so文件)Project->Properties->Builders->New->Program

对了,这段代码实现的功能就是进行两个int的加减,

这里我们首先需要建立一个java文件

package com.jk.ndkdemo;

public class NDKBridge {
	public  native int add(int a,int b);

}

然后我们通过jdk中javah工具,根据NDKBridge类生成.h,在使用命令行时,我们要先进入到bin\clsses javah com.jk.ndkdemo.NDKBridge,生成的.h的命名的规则是包名_类名.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_jk_ndkdemo_NDKBridge */

#ifndef _Included_com_jk_ndkdemo_NDKBridge
#define _Included_com_jk_ndkdemo_NDKBridge
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_jk_ndkdemo_NDKBridge
 * Method:    add
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_com_jk_ndkdemo_NDKBridge_add
  (JNIEnv *, jobject, jint, jint);

#ifdef __cplusplus
}
#endif
#endif

接下来我们根据h文件中的内容,在jni目录中创建c文件

#include "com_jk_ndkdemo_NDKBridge.h"
#include <stdlib.h>
#include <stdio.h>
#ifdef __cplusplus
extern "C"
{
#endif
JNIEXPORT jint JNICALL Java_com_jk_ndkdemo_NDKBridge_add
  (JNIEnv *env, jobject obj, jint a, jint b)
{
	//将jni类型转换成C类型
	int a1 = a;
	int b1 = b;

	int c1 = a1 + b1;

	//将C类型转成JNI类型
	jint c = c1;
	return c;
}
#ifdef __cplusplus
}
#endif

然后我们创建mk文件

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := MyNDKDemo
LOCAL_SRC_FILES := com_jk_ndkdemo_NDKBridge.c
include $(BUILD_SHARED_LIBRARY)

这里的LOCAL_MODULE就是我们生成的so文件的名字,LOCAL_SRC_FILES就是我们根据这个文件来创建的,一旦我们保存,那么就会自动生成so文件

然后我们就需要先加载so文件,然后就可以使用了,这个步骤在activity中实现

package com.jk.ndkdemo;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.Toast;

public class MainActivity extends Activity {
	// 加载so文件
	static {
		System.loadLibrary("MyNDKDemo");
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		// 获得含有jni方法的对象
		NDKBridge bridge = new NDKBridge();
		// 调用jni方法
		int t = bridge.add(3, 5);
		Toast.makeText(this, "" + t, Toast.LENGTH_SHORT).show();
	}

}

好了,一个简单的jni编程就完成了。

时间: 2024-07-29 23:37:36

android学习之jni编程初探的相关文章

android windows 上JNI编程

昨天学习windows上的JNI编程,JNI说白了就是java和c语言的一个互相沟通的桥梁,java可以调用JNI来完成调用C语言实现的方法.JNI的全称是(Java native interface),其实在编程重你只需要将与java交互的函数写出来,其他的C语言内部调用的就可以直接使用C语言相关语法了.闲话少说,开始正题吧. 要想在windroid或者是linux上使用JNI必须要下载NDK的并且指定路径,在windows我们还需要安装一个sygwin,这里我就不再说怎样安装cygwin了,

android学习笔记----JNI中的c控制java

面向对象的底层实现 java作为面向对象高级语言,可对现实世界进行建模.和面向过程不同的是面向对象软件的编写不是流程的堆积,而是对业务逻辑的多视角分解和分类.其过程大致为:      1).将知识分解成不同粒度的小概念.      2).对概念进行分类,形成类.模块.系统      3).用计算机语言将其实现为对象(包含操作和数据) 然而,大多程序员编写代码时很少思考面向对象的体系是如何实现的.因为它属于底层,并不必要.但是,学习过Java反射技术并有所思考的人会意识到,面向对象的种种语法本身也

从壹开始前后端分离【 .NET Core2.0 Api + Vue 3.0 + AOP + 分布式】框架之九 || 依赖注入IoC学习 + AOP界面编程初探

代码已上传Github,文末有地址 说接上文,上回说到了<从壹开始前后端分离[ .NET Core2.0 Api + Vue 2.0 + AOP + 分布式]框架之八 || API项目整体搭建 6.3 异步泛型+依赖注入初探>,后来的标题中,我把仓储两个字给去掉了,因为好像大家对这个模式很有不同的看法,嗯~可能还是我学艺不精,没有说到其中的好处,现在在学DDD领域驱动设计相关资料,有了好的灵感再给大家分享吧. 到目前为止我们的项目已经有了基本的雏形,后端其实已经可以搭建自己的接口列表了,框架已

Android学习笔记--JNI的使用方法

1.JNI是什么 JNI是Java Native Interface的缩写,它提供若干的API实现Java与其他语言之间的通信.而Android Framework由基于Java语言的的Java层与基于C/C++语言的C/C++层组成,每个层中的功能模块都是以有相应的语言编写,并且两层中的大部分模块有着千丝万缕的联系.而在两层之间充当连接桥梁这一角色的就是JNI,它允许Java代码和C/C++编写的应用程序与库之间进行交互:通常在以下几种情况下使用JNI 1.注重处理速度,C/C++的处理速度要

[转]android学习----基础UI编程(四)

CheckBox 的使用 RadioButton 的使用 12. CheckBox 的使用 1)通过只含有一个CheckBox的实例来学习CheckBox的使用 示例代码 ① 创建新工程② 在string.xml 中添加字符串 <?xml version="1.0" encoding="utf-8"?><resources><string name="app_name">Ex_Ctrl_4</string

Android 简单的JNI编程

1.先是编写包含 native 方法的类库 package com.miles.libs; public class Hello { // 加载本地库 static { System.loadLibrary("Hello"); } // 本地库中的方法 public native String hello(); } 2.用javah生成 c/c++ 头文件 javah -classpath 编译目录 类名 javah -classpath ./bin/classes com.miles

Android学习笔记-网络编程

1.使用UDP协议传输数据 UDP协议不可靠,数据包发送出去之后无法确定是否被接收方接收到 在Java里写好Server如下 package com.umgsai.server; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.util.Calendar; import java.util.Date; public class Server { static Date date ; publi

[转]android学习----基础UI编程(六)

相簿浏览 Gallery 文件搜索引擎FileSearch 17. Gallery 与 衍生BaseAdapter 容器 Gallery控件,即Android的图片库控件. 需要定义一个BaseAdaper的子类(eg.ImageAdapter)来操作控制图片资源,然后在主类中通过Gallery.setAdapter(new ImageAdapter(this));来使用这个控制类. 示例代码 本例中 ImageView 和 Gallery 控件相互协作 . ① 新建项目 ② 定义layout

[转]android学习----基础UI编程(二)

7. TextView 和 EditView 共舞 预达到效果:在EditText中输入同时TextView进行输出 //前提:在main.xml中添加EditText 和 TextView控件 核心代码示例: public class EX_Ctrl_1 extends Activity {    private TextView mTextView01;    private EditText mEditText01;    // Called when the activity is fi