简单的JNI开发配置与测试--android

这段时间写的一个android项目用到了c方面的一个方法,由于本人不会c,就想到了jni的方法,好了下面开始简单的配置环境。

谷歌改良了ndk的开发流程,对于Windows环境下NDK的开发,如果使用的NDK是r7之前的版本,必须要安装Cygwin才能使用NDK。而在NDKr7开始,Google的Windows版的NDK提供了一个ndk-build.cmd的脚本,这样,就可以直接利用这个脚本编译,而不需要使用Cygwin了。只需要为Eclipse Android工程添加一个Builders,而为Eclipse配置的builder,其实就是在执行Cygwin,然后传递ndk-build作为参数,这样就能让Eclipse自动编译NDK了

1.必备工具---

android Developer 的NDK工具了,eclipse 

2.环境搭建

1).打开eclipse 创建一个android项目(我的是myjni),在myjni目录下创建jni文件夹,该文件夹就是用来保存NDK编译的文件代码等。

2)开始新建并配置 Builder. 

选中项目右键.Properties->Builders->New,新建一个Builder

在弹出的【Choose configuration type】对话框,选择【Program】,点击【OK】

在弹出的【Edit Configuration】对话框中,配置选项卡 【Main】在“Name“中输入新builders的名称。 

在“Location”中输入nkd-build.cmd的路径(这个是下载完ndk8后解压后的路径,这个建议放在根目录下面,路径不能有空格和中文)

根据各自的ndk路径设置,也可以点击“Browser File System…”来选取这个路径。

在“WorkingDiretcoty”中输入TestNdk位置(也可以点击“BrowseWorkspace”来选取myjni目录)。如图1


图 1

继续在这个【Edit Configuration】对话框中,配置选项卡【Refresh】。如图2 
勾选“Refresh resources upon completion”, 
勾选“The entire workspace”, 
勾选“Recuresively include sub-folders”。


图 2

继续在【EditConfiguration】对话框中,配置选项卡【Build options】。 
勾选“After a “Clean””,(勾选这个操作后,如果你想编译ndk的时候,只需要clean一下项目 就开始交叉编译) 
勾选“During manual builds”, 
勾选“During auto builds”, 
勾选“Specify working set of relevant resources”。如图3


图 3

点击“Specify Resources…”勾选myjni工程中新建的“jni“目录,点击”finish“。 点击“OK“,完成配置。 如图4


图 4

编译环境以及成功搭建完毕!


3. NDK程序Dmo开发

1,在myjni项目中创建一个JniClient.java,其内容如下

package com.ngh.myjni;

public class JniClient {
	 public native String AddStr(String strA, String strB);
	 public native int AddInt(int a, int b);
}
2.生成.h的c++头文件

将cmd命令定位到myjni/bin/classes目录,输入”javah com.ngh.myjni.JniClient“后回车,

在myjni/bin/classes目录下就生成了C++头文件com_ngh_myjni_JniClient.h


com_ngh_myjni_JniClient.h的文件内容如下:

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

#ifndef _Included_com_ngh_myjni_JniClient
#define _Included_com_ngh_myjni_JniClient
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_ngh_myjni_JniClient
 * Method:    AddStr
 * Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_ngh_myjni_JniClient_AddStr
  (JNIEnv *, jclass, jstring, jstring);

/*
 * Class:     com_ngh_myjni_JniClient
 * Method:    AddInt
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_com_ngh_myjni_JniClient_AddInt
  (JNIEnv *, jclass, jint, jint);

#ifdef __cplusplus
}
#endif
#endif

3.在jni目录下新建一个Android.mk文件,其内容如下(关于mk文件需要注意,很重要,还有c和c++文件的mk文件还不一样,此处是调用c语言的mk文件,至于其他的怎么调用,这个自己去百度吧,在此就不多说了)

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

4.将刚刚手动生成的com_ngh_myjni_JniClient.h拷贝到myjni工程的jni目录下,然后新建一个com_ngh_myjni_JniClient.c文件完成头文件中函数的实现,其内容如下(本来想写两个方法的,现在只讲解第一个方法,返回一个字符串“HelloWorld from JNI ”,另一个方法是一个a+b的运算,方法写到这里,感兴趣的可以自己去研究):

com_ngh_myjni_JniClient.c 文件内容

#include "com_ngh_myjni_JniClient.h"
#include <stdlib.h>
#include <stdio.h>
#ifdef __cplusplus
extern "C"
{
#endif


JNIEXPORT jstring JNICALL Java_com_ngh_myjni_JniClient_AddStr(JNIEnv *env,
		jclass arg, jstring instringA, jstring instringB) {
	jstring str = (*env)->NewStringUTF(env, "hello word");
	return str;
}

JNIEXPORT jint JNICALL Java_com_ngh_myjni_JniClient_AddInt(JNIEnv *env,
		jclass arg, jint a, jint b) {
	return a + b;
}
#ifdef __cplusplus
}
#endif

5.在MainActivity.java中完成对JniClient.java中函数的调用(首先静态加载动态链接so库):
public class MainActivity extends Activity {
	
	static{
		System.loadLibrary("myjni");
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
//		setContentView(R.layout.activity_main);
		//第一个方法传入的两个参数没有做操作,直接返回hello jni,不用管
		JniClient jc = new JniClient();
		String str = jc.AddStr("test", "test");  
		
		TextView tv1 = new TextView(this);       
		tv1.setText(str);        
		setContentView(tv1); 
	}

}

6.运行myjni工程,在控制台中可以看到界面输出来自com_ngh_myjni_JniClient.c 文件中的“HelloWorldfrom JNI ! "了。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值