文档章节

android JNI 使用 for mac

宇宙执政
 宇宙执政
发布于 2014/01/03 17:48
字数 537
阅读 1679
收藏 10

使用jni实现Java调用C代码,步骤:

1,下载ndk,链接:http://developer.android.com/tools/sdk/ndk/index.html;解压 ,

2,如果是windows系统,需要安装Cygwin工具,这是window下模拟Linux编译环境的工具(因为Android内核就是Linux);如果windows系统的同学就去找安装这个工具的教程;

3,如果是Linux系统或者mac系统,就直接配置NDK环境变量(我是mac系统,在这里就介绍mac系统的了),和配置adb环境变量一样,将ndk解压路劲加入到环境变量文件中,然后在终端中就可以直接编译了;

4,创建一个Android project,在.java文件中定义一个native方法:

public native String  fromeC();

5,在项目根目录下创建一个jni文件夹,在这个文件夹下创建一个.c文件,用来实现我们定义的native方法;代码如下:

#include <jni.h>
#include <stdio.h>
/*
 * 把Java的方法跟C的方法做个对应,一定要符合这些命名规则,才能java才能找到对应的c代码
 * type:Java
 * PackageName:com_baiyou_mp3ecode    这个类所在的包
 * ClassName:   JNIMp3Encode  native方法所在的类
 * MethodName:    fromC
 * obj:代表调用C代码的Java对象
 */
jstring Java_com_baiyou_mp3ecode_JNIMp3Encode_fromC
(JNIEnv *env, jobject obj)
{
	//c代码
	char* cstr = "hello from c";
	return (**env).NewStringUTF(env,cstr);
}

/*
 * type:Java
 * Package:com_baiyou_mp3ecode
 * Class:     JNIMp3Encode
 * Method:    destroy
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_baiyou_mp3ecode_JNIMp3Encode_destroy
(JNIEnv *env, jobject obj)
{
	lame_close(lame);
}

6,在jni目录下创建Android.mk文件,定义一些规范:代码如下:

LOCAL_PATH := $(call my-dir)
 
include $(CLEAR_VARS)
 
#编译后的c可执行性文件叫啥名
LOCAL_MODULE    	:= JNIMp3Encode

#需要被编译的C源文件
LOCAL_SRC_FILES 	:=JNIMp3Encode.c

LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)

7,打开终端,切换到jni目录下编译.c文件,键入 ndk-build  ;

8,编译完成之后,在根目录会生成libs文件夹,里面的armeabi子文件夹中会有JNIMp3Encode.so 库。

9,在JNIMp3Encode定义了native方法的类中,用静态代码块加入.so类库:如下:

public native String  fromeC();;
	
	static{
		System.loadLibrary("JNIMp3Encode");//这个名字要和在Android.mk文件中定义的LOCAL_MODULE    	:= JNIMp3Encode这个名字一样
	}

10,然后在其他.java文件中就可以调用fromeC();这个本地方法了;



© 著作权归作者所有

共有 人打赏支持
宇宙执政
粉丝 34
博文 116
码字总数 65640
作品 0
高级程序员
私信 提问
加载中

评论(4)

tmacsky
tmacsky

引用来自“安身开源国”的评论

引用来自“tmacsky”的评论

无法编译
make: *** No rule to make target `/Users/hl/Documents/workspace/jni/jni/JNIMp3Encode.c', needed by `/Users/hl/Documents/workspace/jni/obj/local/armeabi/objs/JNIMp3Encode/JNIMp3Encode.o'. Stop.

博客的代码只是核心代码,并不是完整代码
那怎么办?没办法么?我看了很多这样的文章,没一个成功过~mac,windows 2种都试过都不行
tmacsky
tmacsky
那就是没办法解决这个问题?
宇宙执政
宇宙执政

引用来自“tmacsky”的评论

无法编译
make: *** No rule to make target `/Users/hl/Documents/workspace/jni/jni/JNIMp3Encode.c', needed by `/Users/hl/Documents/workspace/jni/obj/local/armeabi/objs/JNIMp3Encode/JNIMp3Encode.o'. Stop.

博客的代码只是核心代码,并不是完整代码
tmacsky
tmacsky
无法编译
make: *** No rule to make target `/Users/hl/Documents/workspace/jni/jni/JNIMp3Encode.c', needed by `/Users/hl/Documents/workspace/jni/obj/local/armeabi/objs/JNIMp3Encode/JNIMp3Encode.o'. Stop.
如何为Android,Mac和Windows平台创建Java JNI动态链接库

Java Native Interface (JNI) 是Java和C/C++之间的桥梁。在一些情况下,为了提高Java程序的性能,扩展Java程序的功能,我们需要使用JNI。比如数据库的调用,当我们下载一个JDBC的jar包之后,...

yushulx
2014/09/17
0
0
Android JNI MAC OS环境配置

Android JNI MAC OS环境配置 http://whbzju.github.io/blog/2013/06/01/android-jni-config/ JUN 1ST, 2013 | COMMENTS 前言—JNI技术简介 JNI是Java Native Interface的缩写,即“Java本地调......

whb_zju
2013/06/02
0
0
Android获取当前手机蓝牙Mac地址(5.0,6.0-7.0,8.0-9.0) -(进行中),蓝牙电话

注意:当前Android手机5.0,6.0-7.0能获取蓝牙Mac地址;而当前Android手机8.0-9.0蓝牙Mac地址获取不到,API被隐藏的更深了?? Oreo(Android O) 8.0 2017年8月22日 API level 26 Oreo(And...

desaco
01/30
0
0
初识 Android Native Development Kit (NDK)

Android开发者社区对JNI的呼声一直很高,这次Google发布NDK可以说是顺应民意。NDK和SDK一样提供了Linux、Windows、Mac三大开发平台的版本。 在Linux上,尤其是Debian/Ubuntu上进行安装,非常...

红薯
2009/07/03
15.1K
4
Android Studio之NDK环境搭建,so文件打包以及使用

本篇入门教程开发环境为mac + Android Studio + gradle 2.14.1,主要包含以下3块内容: NDK环境搭建 编写第一个JNI项目 打包出动态so文件,在其他项目中使用 一、NDK环境搭建 从Android Stu...

ljianbing
2018/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

day11

architect刘源源
今天
6
0
论学好Linux系统的超级重要性

不知道各位在日常的工作生活中有没有接触过“rm -rf /*”这个命令,因为这个命令搞出来的事情可还不少呢!前段时间就在一个群里看到了有个小伙子,老板让他去维护一下服务器,这小伙也不太懂...

Linux就该这么学
昨天
6
0
git 使用

1,首先在github配置好信息和仓库,然后在本地进行操作 git init git config user.name 'zhangwuer' git config user.email '56789053@qq.com' 2,与远程分支建立连接 git checkout -b test......

天王盖地虎626
昨天
3
0
git checkout 命令详解

在日常的git操作中,git checkout——检出,是我们的常用命令。最为常用的两种情形是创建分支和切换分支。 在下面的命令中,使用了一些简写,在这里说明一下: git st # git statusgit ci ...

shzwork
昨天
10
0
【Nginx】Nginx多级代理,获取客户端真实请求IP以及每级代理IP

Nginx多级代理,获取客户端真实请求IP以及每级代理IP 如图所示,每一级nginx里的location配置里需要加上对应的配置,最后一级nginx是直接到应用,测试时为了方便,直接用echo模块去测试,打印...

薛定谔的旺
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部