初识JNI之-编写第一个HelloJNI

这篇博客介绍了如何在Android项目中使用JNI技术。首先在MainActivity中声明Native方法,通过Android Tools添加Native Support,创建JNI目录。接着讲解了HelloJni.cpp文件中的C++代码,包括jni.h头文件的选择,以及extern "C"的作用。然后,分析了Android.mk文件的编译过程,并指导如何在命令行使用ndk-build进行编译。最后,说明如何在Android应用中加载并调用JNI库的方法。
摘要由CSDN通过智能技术生成

新建android项目


1.首先声明native方法 这里我们在MainActivity中声明Navtive方法


public class MainActivity extends ActionBarActivity {
	public native String HelloWorld();//1
	
	static{
		System.loadLibrary("Hello");
	}
	private TextView text;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		text=(TextView) this.findViewById(R.id.text);
		text.setText(HelloWorld());
	}
	
}


然后选中项目->Android Tools->Add Native Support填写名称 点击Finish 这里我以HelloJni为例


这时会在项目下生成JNI目录 其中有两个文件


第一个文件 HelloJni.cpp  注意此后缀是cpp 也就是C++代码的源文件 那么里面当然要写C++的代码了


具体代码


#include <jni.h>
extern "C"{
	jstring Java_com_android_hellojni_MainActivity_HelloWorld(JNIEnv *env, jobject thiz)
	{
		return env->NewStringUTF( "Hello from JNI !");
	}
}

首先第一句#include<jni.h>引入jni.h 头部文件

查看下AndroidManifest.xml配置文件其中 minSdkVersion=10

那么头部文件源代码在  android-ndk-r10d\platforms\android-9\arch-arm\usr\include中

基于AndroidManifest.xml中的minSdkVersion属性选择jni.h文件


第三句 jstring Java_com_android_hellojni_MainActivity_HelloWorld(JNIEnv *env,jobject thiz){}

其中 jstring表示我们返回String类型

Java_完整包名类名_方法名

这里Java的J首字母一定要大写


其中有两个参数  


JNIEnv指针是JVM创建的,用于Native的c/c++方法操纵Java执行栈中的数据

jobject 表示当前java对象 例如 MainActivity


这里说明下为什么要extern "C"

由于我们是C++代码 当cpp编译器 编译代码时  就有可能把这个函数改成  _Java_com_android_hellojni_MainActivity_HelloWorldjj

而C编译的时候会把他编译成 _Java_com_android_hellojni_MainActivity_HelloWorld

当我们使用jni调用时 他会去找 _Java_com_android_hellojni_MainActivity_HelloWorld这个标识  但是找不到

而我们使用 extern "C"后 那么都会引用一个 _Java_com_android_hellojni_MainActivity_HelloWorld标识

不知道这里理解的对不对,请指出


第二个文件 Android.mk

获取当前文件内容 : $(call my-dir) 是编译器中的宏方法, 调用该宏方法, 就会返回前的目录路径; 
赋值符号 : " := " 是赋值符号, 第一句话 是 返回当前文件所在的当前目录, 并将这个目录路径赋值给 LOCAL_PATH;
初始化编译模块参数 : $(CLEAR_VARS) 作用是将编译模块的参数初始化, LOCAL_MODULE LOCAL_SRC_FILES 也是这样的参数;
指定编译模块 : LOCAL_MODULE    := hello , 指定编译后的 so 文件名称, 编译好之后系统会在该名称前面加上 "lib", 后缀加上 ".so";
指定编译源文件 : LOCAL_SRC_FILES := hello.c 告诉编译系统源文件, 如果有多个文件那么就依次写在后面即可; 
编译成静态库 : include $(BUILD_SHARED_LIBRARY), 作用是高速系统, 编译的结果编译成 .so 后缀的静态库;


然后在cmd命令中 输入cd D:\MySoft\adt-bundle-windows-x86_64-20140702\eclipse\workspace\HelloJni\jni 切换到项目下的jni目录中 然后输入ndk-build命令进行编译,完成后会自动引入项目 lib下armeabi下


最后我们使用

System.loadLibrary("Hello")引入


然后通过text.setText(HelloWorld());调用即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值