JNI_NDK调用C语言
来源:互联网 发布:小商店记账软件 编辑:程序博客网 时间:2024/06/01 23:48
- 在Eclipse中创建项目:TestJNI
- 新创建一个class:TestJNI.javapackagecom.xiaowenzi.xiaojni;publicclassTestJNI {publicnative boolean Init();publicnative int Add(intx,int y);publicnative void Destory();publicstatic void main(String[] args) {System.out.println("123456789");}}创建完之后执行一遍!生成相应的class文件.
- 生成C语言头文件(cmd操作)
C:\Users\Administrator>D:
D:\>cd Users\Administrator\androidworkspace\XiaoJNI\src
javah
-classpath D:\Users\Administrator\androidworkspace\XiaoJNI\bin\classes
-d D:\Users\Administrator\androidworkspace\XiaoJNI\bin\classes
-jni com.xiaowenzi.xiaojni.TestJNI
javah中各个命令的意思是
-classpath <路径> 用于装入类的路径
-d <目录> 输出目录
-jni 生成 JNI样式的头文件(默认)
执行javah命令之后, 会在D:\Users\Adminis idworkspace\XiaoJNI\bin\classes目录下生成头文件:com_xiaowenzi_xiaojni_TestJNI.h, 将它复制到jni文件夹下,打开如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>/* Header for class com_xiaowenzi_xiaojni_TestJNI */
#ifndef _Included_com_xiaowenzi_xiaojni_TestJNI
#define _Included_com_xiaowenzi_xiaojni_TestJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_xiaowenzi_xiaojni_TestJNI
* Method: Init
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_com_xiaowenzi_xiaojni_TestJNI_Init
(JNIEnv *, jobject);
/*
* Class: com_xiaowenzi_xiaojni_TestJNI
* Method: Add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_xiaowenzi_xiaojni_TestJNI_Add
(JNIEnv *, jobject, jint, jint);
/*
* Class: com_xiaowenzi_xiaojni_TestJNI
* Method: Destory
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_xiaowenzi_xiaojni_TestJNI_Destory
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
- 使用C/C++实现JNI在jni文件夹下,创建com_xiaowenzi_xiaojni_TestJNI.cpp.h对应的cpp文件:com_xiaowenzi_xiaojni_TestJNI.cpp再添加两个文件Add.h, Add.cpp,具体实现放在这两个文件中来完成。 Add.h#ifndef_TEST_JNI_ADD_H_#define_TEST_JNI_ADD_H_classCAdd{public:CAdd();~CAdd();intAdd(intx,inty);};#endif Add.cpp(实现 Add.h里面的方法)#include"Add.h"CAdd::CAdd() {}CAdd::~CAdd() {}intCAdd::Add(intx,inty) {returnx + y;} com_xiaowenzi_xiaojni_TestJNI.cpp(实现com_xiaowenzi_xiaojni_TestJNI.h的方法)#include<stdio.h>#include<stdlib.h>#include"com_xiaowenzi_xiaojni_TestJNI.h"#include"Add.h"CAdd *pCAdd = NULL;JNIEXPORT jboolean JNICALLJava_com_xiaowenzi_xiaojni_TestJNI_Init(JNIEnv *env,jobject obj) {if(pCAdd == NULL) {pCAdd =newCAdd;}returnpCAdd != NULL;}JNIEXPORT jint JNICALLJava_com_xiaowenzi_xiaojni_TestJNI_Add(JNIEnv *env, jobject obj,jint x, jint y) {intres = -1;if(pCAdd != NULL) {res = pCAdd->Add(x, y);}returnres;}JNIEXPORTvoidJNICALL Java_com_xiaowenzi_xiaojni_TestJNI_Destory(JNIEnv *env, jobject obj){if(pCAdd != NULL){pCAdd = NULL;}}
- 创建mk文件,并使用ndk-build命令生成.so动态链接库文件 在jni目录下创建Android.mk文件如下:LOCAL_PATH :=$(call my-dir)include$(CLEAR_VARS)TARGET_CPU_API := armeabiAPP_ABI := armeabiLOCAL_MODULE := TestJNILOCAL_SRC_FILES := com_xiaowenzi_xiaojni_TestJNI.cppLOCAL_SRC_FILES += Add.cppinclude$(BUILD_SHARED_LIBRARY)LOCAL_PATH是C/C++代码所在目录,也就是我们的jni目录。LOCAL_MODULE是要编译的库的名称。编译器会自动在前面加上lib,在后面加上.so。LOCAL_SRC_FILES是要编译的C/C++文件LOCAL_LDLIBS:= -ljnigraphics -llog 如果没用到BitMap不要添加。在jni目录下创建Application.mk文件:APP_PROJECT_PATH :=$(call my-dir)/..APP_MODULES := TestJNIAPP_ABI := armeabi //(lib下的路径)用ndk来为我们生成相应的动态链接库了。首先需要下载NDK,并把NDK路径配置到path环境变量中去。(具体方法转:http://jingyan.baidu.com/article/574c52193c80fb6c8c9dc153.html)下载完成之后,进入Application.mk文件所在目录,在命令行中使用ndk-build生成.so文件。具体操作如下:在android 项目中配置编译器1 创建builer
(a)Project->Properties->Builders->New,新建一个Builder。
(b)在弹出的【Choose configuration type】对话框,选择【Program】,点击【OK】:
(c)在弹出的【Edit Configuration】对话框中,配置选项卡【Main】。
在“Name“中输入新builders的名称(我取名为Ndk_Builder)。(d)配置选项卡------Main选项卡----------------2在“Location”中输入nkd-build.cmd的路径。在“Working Diretcoty”中输入${workspace_loc:/HelloJni}(也可以点击“Browse Workspace”来选取 HelloJni目录)。--------Build Options选项卡-------
勾选“After a “Clean””,
勾选“During manual builds”,
勾选“During auto builds”,
勾选“Specify working set of relevant resources”。
点击“Specify Resources…”勾选工程的“jni“目录里的Android.mk文件,点击”finish“。3配置完成,Run 项目,在项目的libs文件夹中自动生成so文件6. 编译成功后会在工程目录的libs/armeabi目录下生成一个libTestJNI.so文件。
1 0
- JNI_NDK调用C语言
- java调用C语言
- C语言调用汇编
- c语言调用gawk
- C语言调用Matlab
- C语言调用方式
- C语言函数调用
- C# 调用C 语言
- Java调用C语言
- C语言调用msyql
- c语言调用c++
- matlab调用C语言
- Java调用C语言
- C语言调用驱动程序
- c语言调用matlab
- c语言调用lua
- 【C语言】调用函数
- C语言函数调用
- Java中如何解决double和float精度不准的问题
- ffmeng在线教程
- LDD3学习笔记(1) 写笔记的原因和搭建环境
- POJ 3188暴搜
- 多版本JAVA 共存 JAVA版本升级迁移(windows)
- JNI_NDK调用C语言
- 条款十九:了解临时对象的来源
- 九度OJ题目1201:二叉排序树
- Android本地登录与WebView网页登陆同步问题(cookie同步问题)
- 年终总结
- ros基础
- Hadoop2.0安装包目录结构分析
- C#用NPOI读取excel
- linux安装svn服务端