- 浏览: 123761 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (110)
- android动画 (9)
- android(xml相关) (2)
- android sqlite3 (0)
- android 组件学习 (5)
- android 小技巧 (8)
- android自定义组件 (2)
- android 手机服务 (5)
- android 网络相关 (9)
- android 用户界面 (6)
- 基本概念 (30)
- java基本知识 (3)
- 面试题 (2)
- android sdcard (3)
- android 文件操作 (4)
- 闲谈android风云变幻 (10)
- JNI (3)
- NDK (5)
- linux (6)
- IOS学习 (1)
- Android源码 (1)
最新评论
-
AndLi:
高手
Android 实现书籍翻页效果----原理篇 -
niuniulife2011:
没听懂,任何事情任何人都可以做吧
程序员感想 -
chenliang1234576:
程序员开网店有木有搞头撒?
程序员感想 -
liyanginchina:
请问一下,
1、 A和B分别与S的【主连接】保持联系。
那么 ...
TCP实现P2P通信、TCP穿越NAT的方法、TCP打洞 -
niuniulife2011:
一起进步,我的东西,有些是看了别人的,但是在看了别人的之后,都 ...
windows系统上使用Android NDK r5
一、JNI简介
JNI:Java Native Interface,是Java语言提供的一种通用接口,用于Java代码与本地化代码的交互。所谓本地化代码是指直接编译成的与机器相关的二进制代码,而非Java字节码之类的中间代码。Windows下面的可执行文件,DLL等,Linux下面的可执行文件和SO文件等,都是二进制代码。
JNI允许Java语言编写的程序与其他语言编写的程序库(DLL, SO)或可执行文件进行互操作,包括汇编、C、C++。
JNI产生的原因在于以下几种需求:
(1). 你的应用程序需要使用系统相关的功能,而Java代码不支持或是难以办到。这个比较典型的是实现托盘图标,有几种现成的方案都是用的JNI做的,名字好像是叫做TrayIcon和StayOnTop。当然啦,如果是用的Java1.6,那就要另当别论了。
(2). 已有其他语言写好的类库或程序,希望Java程序可以使用它们。
(3). 出于更高的性能要求,希望使用汇编或是C/C++语言来实现部分功能。
二、JNI的开发步骤
这里以使用C++编写本地化方法实现为例,开发一个使用JNI的Demo程序,具体步骤如下所示:
(1). 编写带有native方法的java类
(2). 使用javac命令编译所编写的java类
(3). 使用javah命令处理类文件,生成C/C++头文件
(4). 使用C/C++实现本地方法
(5). 将C/C++编写的文件生成动态连接库
三、Demo程序,Demo程序宣示了Java代码中调用C++的输出功能打印字符串,同时演示了使用C++的输入功能读取字符串,并使用System.out.println输出。
1. 编写带native方法的Java类
本示例中的源程序就一个Java类。如下所示:
// HelloJNI.java -- 简单的JNI入门示例。
// 2007-4-5 16:41:45
public class HelloJNI {
public native void displayHello();
public native void showTime();
private native String getLine(String prompt);
static {
System.loadLibrary("hello");
}
public static void main(String[] args) throws Exception {
HelloJNI hj = new HelloJNI();
System.out.println("==> Demo 1: hello");
hj.displayHello();
System.out.println("==> Demo 2: time");
hj.showTime();
System.out.println("==> Demo 3: input");
String input = hj.getLine("Type a line: ");
System.out.println("User typed: " + input);
}
}
说明:一共3个native方法,第一个简单的Hello,第二个使用<ctime>头文件中的相关函数计算当前时间,第三个读取输入。注意static语句块:
static {
System.loadLibrary("hello");
}
在JVM载入HelloJNI类的时候加载动态库,System.loadLibrary()中的参数是我们要生成的动态库文件的名字,不包括扩展名,在Windows下面是hello.dll,Linux下面是hello.so,这个由Java自动识别。
2. 编译此类
javac HelloJNI 生成HelloJNI.class文件
3. 使用javah HelloJNI 生成C/C++头文件,生成的头文件不用任何修改。如下所示:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloJNI */
#ifndef _Included_HelloJNI
#define _Included_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloJNI
* Method: displayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloJNI_displayHello
(JNIEnv *, jobject);
/*
* Class: HelloJNI
* Method: showTime
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloJNI_showTime
(JNIEnv *, jobject);
/*
* Class: HelloJNI
* Method: getLine
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_HelloJNI_getLine
(JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif
4. 编写C/C++实现文件,如下所示:
// HelloJNIImpl.cpp -- 自己编写的实现文件
// 2007-4-5 16:52:53
#include <jni.h>
#include <iostream>
#include <ctime>
#include <string>
#include <cstdio>
#include <windows.h>
#include "HelloJNI.h"
extern "C" {
//
}
using namespace std;
JNIEXPORT void JNICALL Java_HelloJNI_displayHello(JNIEnv * env, jobject obj) {
cout << "Hello, JNI tech. This is from C++!" << endl;
}
JNIEXPORT void JNICALL Java_HelloJNI_showTime(JNIEnv * env, jobject obj) {
time_t sec;
tm t;
time_t loop;
cout << "时间:";
sec = time(NULL);
t = *localtime(&sec);
unsigned int hour = t.tm_hour;
unsigned int mini = t.tm_min;
unsigned int secd = t.tm_sec;
if(hour < 10) {
cout << "0" << hour;
}
else {
cout << hour;
}
cout << ":";
if(mini < 10) {
cout << "0" << mini;
}
else {
cout << mini;
}
cout << ":";
if(secd < 10) {
cout << "0" << secd;
}
else {
cout << secd;
}
cout << endl;
}
JNIEXPORT jstring JNICALL Java_HelloJNI_getLine(JNIEnv * env, jobject obj, jstring prompt) {
char buf[128] = {0};
const char * str = (env)->GetStringUTFChars(prompt, 0);
// printf("%s", str);
cout << str;
(env)->ReleaseStringUTFChars(prompt, str);
string buffer;
getline(cin, buffer);
// scanf("%s", buf);
return (env)->NewStringUTF(buffer.c_str());
}
说明:JNI Tutorial中使用的居然是像下面这样的代码,env指针的使用应该有误,敬请注意。
JNIEXPORT jstring JNICALL
Java_Prompt_getLine(JNIEnv *env, jobject obj, jstring prompt)
{
char buf[128];
const char *str = (*env)->GetStringUTFChars(env, prompt, 0);
printf("%s", str);
(*env)->ReleaseStringUTFChars(env, prompt, str);
...
5. 生成本地库文件。笔者使用的vs2008 中的C++编译器。vs2008命令行工具生成DLL的命令:
cl -I<头文件目录1> -I<头文件目录2> -LD <C/C++源文件名> -Fe<生成的DLL文件名>
-I选项指定头文件目录,-LD指定C++源文件,-Fe指定生成的DLL文件名。将各个部分替换成实际的情况,实际使用的命令如下:
cl -C:\Java\jdk1.6.0_10\include -IC:\Java\jdk1.6.0_10\include\win32 -LD HelloJNIImpl.cpp -Fehello.dll
关于这里的cl命令使用,及在vs2008中使用请看下一篇文章Vs2008 与JNI示例。
6. 运行结果,如下图所示:
7. 自动化。其实步骤都很简单,所以可以使用Ant来完成。下面提供一个ANT Buildfile。使用之前请根据自己的实际情况修改相关属性。
注意:Builfile编码是UTF-8的。
build.xml
<?xml version="1.0" encoding="UTF-8"?>
<project default="help" basedir="." name="JNI_Hello">
<property name="app.home" value="."></property>
<!-- 设置头文件的目录,根据JDK具体的安装目录而定 -->
<property name="h.dir1" value="C:/java/jdk1.5.0_10/include"></property>
<property name="h.dir2" value="C:/java/jdk1.5.0_10/include/win32"></property>
<!-- 设置cl工具的路径,视具体情况而定 -->
<property name="vc.bin.dir"
value="C:/Program Files/Microsoft Visual Studio .NET 2003/Vc7/bin">
</property>
<property name="cpp.name" value="HelloJNIImpl.cpp"></property>
<property name="dll.name" value="hello.dll"></property>
<target name="compile" description=" ==> 编译Java源文件">
<javac srcdir="${app.home}" destdir="${app.home}">
</javac>
</target>
<target name="javah" description=" ==> 生成C/C++头文件">
<javah destdir="${app.home}" force="yes" class="HelloJNI"/>
</target>
<target name="dll" description=" ==> 调用cl命令生成相关的DLL文件">
<exec dir="${app.home}" executable="${vc.bin.dir}/cl.exe" os="Windows XP">
<!-- 参数-EHsc好像是VS.NET2003中cl.exe的,可以不加,参考下面的注释行 -->
<arg line="-EHsc -I${h.dir1} -I${h.dir2} -LD ${cpp.name} -Fe${dll.name}"/>
<!--
<arg line="-I${h.dir1} -I${h.dir2} -LD ${cpp.name} -Fe${dll.name}"/>
-->
</exec>
</target>
<target name="run" description=" ==> 运行">
<java classname="HelloJNI"></java>
</target>
<target name="all" description=" ==> 自动进行上面任务列表">
<antcall target="compile"/>
<antcall target="javah"/>
<antcall target="dll"/>
<antcall target="run"/>
</target>
<target name="help" description=" ==> 显示帮助信息">
<echo>用法帮助:</echo>
<echo>ant compile 编译Java源文件</echo>
<echo>ant javah 生成C/C++头文件</echo>
<echo>ant dll 调用cl命令生成相关的DLL文件</echo>
<echo>ant run 运行</echo>
<echo></echo>
<echo>ant all 自动进行上面任务列表</echo>
<echo>ant help 显示帮助信息</echo>
</target>
</project>
Done!^_^!
JNI还有很多高级的功能,这里我就不说了,一来是不太会,二来也没什么意义。JNI Tutorial上讲得很全面,不错。
JNI:Java Native Interface,是Java语言提供的一种通用接口,用于Java代码与本地化代码的交互。所谓本地化代码是指直接编译成的与机器相关的二进制代码,而非Java字节码之类的中间代码。Windows下面的可执行文件,DLL等,Linux下面的可执行文件和SO文件等,都是二进制代码。
JNI允许Java语言编写的程序与其他语言编写的程序库(DLL, SO)或可执行文件进行互操作,包括汇编、C、C++。
JNI产生的原因在于以下几种需求:
(1). 你的应用程序需要使用系统相关的功能,而Java代码不支持或是难以办到。这个比较典型的是实现托盘图标,有几种现成的方案都是用的JNI做的,名字好像是叫做TrayIcon和StayOnTop。当然啦,如果是用的Java1.6,那就要另当别论了。
(2). 已有其他语言写好的类库或程序,希望Java程序可以使用它们。
(3). 出于更高的性能要求,希望使用汇编或是C/C++语言来实现部分功能。
二、JNI的开发步骤
这里以使用C++编写本地化方法实现为例,开发一个使用JNI的Demo程序,具体步骤如下所示:
(1). 编写带有native方法的java类
(2). 使用javac命令编译所编写的java类
(3). 使用javah命令处理类文件,生成C/C++头文件
(4). 使用C/C++实现本地方法
(5). 将C/C++编写的文件生成动态连接库
三、Demo程序,Demo程序宣示了Java代码中调用C++的输出功能打印字符串,同时演示了使用C++的输入功能读取字符串,并使用System.out.println输出。
1. 编写带native方法的Java类
本示例中的源程序就一个Java类。如下所示:
// HelloJNI.java -- 简单的JNI入门示例。
// 2007-4-5 16:41:45
public class HelloJNI {
public native void displayHello();
public native void showTime();
private native String getLine(String prompt);
static {
System.loadLibrary("hello");
}
public static void main(String[] args) throws Exception {
HelloJNI hj = new HelloJNI();
System.out.println("==> Demo 1: hello");
hj.displayHello();
System.out.println("==> Demo 2: time");
hj.showTime();
System.out.println("==> Demo 3: input");
String input = hj.getLine("Type a line: ");
System.out.println("User typed: " + input);
}
}
说明:一共3个native方法,第一个简单的Hello,第二个使用<ctime>头文件中的相关函数计算当前时间,第三个读取输入。注意static语句块:
static {
System.loadLibrary("hello");
}
在JVM载入HelloJNI类的时候加载动态库,System.loadLibrary()中的参数是我们要生成的动态库文件的名字,不包括扩展名,在Windows下面是hello.dll,Linux下面是hello.so,这个由Java自动识别。
2. 编译此类
javac HelloJNI 生成HelloJNI.class文件
3. 使用javah HelloJNI 生成C/C++头文件,生成的头文件不用任何修改。如下所示:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloJNI */
#ifndef _Included_HelloJNI
#define _Included_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloJNI
* Method: displayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloJNI_displayHello
(JNIEnv *, jobject);
/*
* Class: HelloJNI
* Method: showTime
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloJNI_showTime
(JNIEnv *, jobject);
/*
* Class: HelloJNI
* Method: getLine
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_HelloJNI_getLine
(JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif
4. 编写C/C++实现文件,如下所示:
// HelloJNIImpl.cpp -- 自己编写的实现文件
// 2007-4-5 16:52:53
#include <jni.h>
#include <iostream>
#include <ctime>
#include <string>
#include <cstdio>
#include <windows.h>
#include "HelloJNI.h"
extern "C" {
//
}
using namespace std;
JNIEXPORT void JNICALL Java_HelloJNI_displayHello(JNIEnv * env, jobject obj) {
cout << "Hello, JNI tech. This is from C++!" << endl;
}
JNIEXPORT void JNICALL Java_HelloJNI_showTime(JNIEnv * env, jobject obj) {
time_t sec;
tm t;
time_t loop;
cout << "时间:";
sec = time(NULL);
t = *localtime(&sec);
unsigned int hour = t.tm_hour;
unsigned int mini = t.tm_min;
unsigned int secd = t.tm_sec;
if(hour < 10) {
cout << "0" << hour;
}
else {
cout << hour;
}
cout << ":";
if(mini < 10) {
cout << "0" << mini;
}
else {
cout << mini;
}
cout << ":";
if(secd < 10) {
cout << "0" << secd;
}
else {
cout << secd;
}
cout << endl;
}
JNIEXPORT jstring JNICALL Java_HelloJNI_getLine(JNIEnv * env, jobject obj, jstring prompt) {
char buf[128] = {0};
const char * str = (env)->GetStringUTFChars(prompt, 0);
// printf("%s", str);
cout << str;
(env)->ReleaseStringUTFChars(prompt, str);
string buffer;
getline(cin, buffer);
// scanf("%s", buf);
return (env)->NewStringUTF(buffer.c_str());
}
说明:JNI Tutorial中使用的居然是像下面这样的代码,env指针的使用应该有误,敬请注意。
JNIEXPORT jstring JNICALL
Java_Prompt_getLine(JNIEnv *env, jobject obj, jstring prompt)
{
char buf[128];
const char *str = (*env)->GetStringUTFChars(env, prompt, 0);
printf("%s", str);
(*env)->ReleaseStringUTFChars(env, prompt, str);
...
5. 生成本地库文件。笔者使用的vs2008 中的C++编译器。vs2008命令行工具生成DLL的命令:
cl -I<头文件目录1> -I<头文件目录2> -LD <C/C++源文件名> -Fe<生成的DLL文件名>
-I选项指定头文件目录,-LD指定C++源文件,-Fe指定生成的DLL文件名。将各个部分替换成实际的情况,实际使用的命令如下:
cl -C:\Java\jdk1.6.0_10\include -IC:\Java\jdk1.6.0_10\include\win32 -LD HelloJNIImpl.cpp -Fehello.dll
关于这里的cl命令使用,及在vs2008中使用请看下一篇文章Vs2008 与JNI示例。
6. 运行结果,如下图所示:
7. 自动化。其实步骤都很简单,所以可以使用Ant来完成。下面提供一个ANT Buildfile。使用之前请根据自己的实际情况修改相关属性。
注意:Builfile编码是UTF-8的。
build.xml
<?xml version="1.0" encoding="UTF-8"?>
<project default="help" basedir="." name="JNI_Hello">
<property name="app.home" value="."></property>
<!-- 设置头文件的目录,根据JDK具体的安装目录而定 -->
<property name="h.dir1" value="C:/java/jdk1.5.0_10/include"></property>
<property name="h.dir2" value="C:/java/jdk1.5.0_10/include/win32"></property>
<!-- 设置cl工具的路径,视具体情况而定 -->
<property name="vc.bin.dir"
value="C:/Program Files/Microsoft Visual Studio .NET 2003/Vc7/bin">
</property>
<property name="cpp.name" value="HelloJNIImpl.cpp"></property>
<property name="dll.name" value="hello.dll"></property>
<target name="compile" description=" ==> 编译Java源文件">
<javac srcdir="${app.home}" destdir="${app.home}">
</javac>
</target>
<target name="javah" description=" ==> 生成C/C++头文件">
<javah destdir="${app.home}" force="yes" class="HelloJNI"/>
</target>
<target name="dll" description=" ==> 调用cl命令生成相关的DLL文件">
<exec dir="${app.home}" executable="${vc.bin.dir}/cl.exe" os="Windows XP">
<!-- 参数-EHsc好像是VS.NET2003中cl.exe的,可以不加,参考下面的注释行 -->
<arg line="-EHsc -I${h.dir1} -I${h.dir2} -LD ${cpp.name} -Fe${dll.name}"/>
<!--
<arg line="-I${h.dir1} -I${h.dir2} -LD ${cpp.name} -Fe${dll.name}"/>
-->
</exec>
</target>
<target name="run" description=" ==> 运行">
<java classname="HelloJNI"></java>
</target>
<target name="all" description=" ==> 自动进行上面任务列表">
<antcall target="compile"/>
<antcall target="javah"/>
<antcall target="dll"/>
<antcall target="run"/>
</target>
<target name="help" description=" ==> 显示帮助信息">
<echo>用法帮助:</echo>
<echo>ant compile 编译Java源文件</echo>
<echo>ant javah 生成C/C++头文件</echo>
<echo>ant dll 调用cl命令生成相关的DLL文件</echo>
<echo>ant run 运行</echo>
<echo></echo>
<echo>ant all 自动进行上面任务列表</echo>
<echo>ant help 显示帮助信息</echo>
</target>
</project>
Done!^_^!
JNI还有很多高级的功能,这里我就不说了,一来是不太会,二来也没什么意义。JNI Tutorial上讲得很全面,不错。
发表评论
-
android 学习之android sdk更新问题
2016-08-31 11:48 551http://cristalspring.blog.163.c ... -
make prebuilt
2012-04-27 12:50 2034步骤如下: 1。进入alps-trunk-mg702\vend ... -
优秀组件使用
2011-08-17 16:34 791http://www.cnblogs.com/webabcd/ ... -
listView优化
2011-07-27 17:46 926于是,改用其它一种写法: public View getVie ... -
在 Ubuntu 10.04 下面安装 Android USB 驱动
2011-07-13 09:52 23351、在 Ubuntu 9.04 下面安装 Android US ... -
Android SDK problem solved in ubuntu 10.04 AMD64
2011-07-13 08:57 1114Failed to get the adb version: ... -
视频码率
2011-07-08 17:52 972码率 码率就是数据 ... -
Android编译问题:Only 64-bit build environments are supported beyond froyo/2.2
2011-07-06 09:58 905下载完代码后,进行make, $cd ~/mydroid $m ... -
windows系统上使用Android NDK r5
2011-07-05 13:54 1303一、cygwin安装及有关工 ... -
APK签名
2011-07-01 17:58 955刚学android,在windows xp ... -
线程--BlockingQueue
2011-07-01 17:57 815特殊的队列:BlockingQueue,如果BlockingQ ... -
设置组件状态--如何动态关闭manifest中的Receiver
2011-07-01 17:56 859为什么要关闭组件? 在用到组件时,有时候我们可能暂时性的不使 ... -
玩转Android---组件篇---Handler的使用(1)
2011-07-01 17:07 1111在android中,有很多功能是不能放在onCreate或者o ... -
Android sdk 安装后 找不到adb.exe问题解决方法
2011-07-01 14:49 2799最近刚出了android2.3,想尝一下鲜。用Sdk Mana ... -
vs2008:无法打开文件kernel32.lib(LNK1104)
2011-07-01 11:14 2618【背景描述】 系统环境变化:Vista HomeBasic - ... -
vc2008 cl命令环境变量设置
2011-07-01 10:58 1357由于执行C:\Program Files\Microsoft ... -
手机的分辨率和像素的学习(纠结过一段时间,不过总算明白鸟)
2011-06-30 14:02 775手机的分辨率是对一个手机屏幕能显示的像素点的多少的意思,比如: ... -
Message Queue的角色(高老师的教程)
2011-06-30 13:46 7651.Android程式裡,新誕生一個線程,或稱執行緒(Thre ... -
Looper物件之角色(Demo 1)
2011-06-30 13:45 591先看例子一: Java代码 package com.ex ... -
Looper物件之角色(Demo 2)
2011-06-30 13:42 683由別的線程送訊息到主線程的Message Queue Jav ...
相关推荐
这个"Android JNI示例"提供了学习JNI调用流程的实践指导。 JNI的核心概念包括以下几个部分: 1. **本地方法**: 在Java类中声明但由本地(非Java)代码实现的方法。这些方法通常用`native`关键字标识。 2. **...
以下是一个简单的JNI示例,演示了如何访问和修改一个对象的实例成员域: 1. **访问一个实例成员域的步骤** (Procedure for Accessing an Instance Field) - 首先,本地方法需要获取对象的类引用(`jclass`),通过`...
Android源码下编译JNI(Java Native Interface)示例项目是一种深入理解Android系统与本地C/C++代码交互机制的关键实践。JNI是Java平台提供的一种接口,允许Java代码和其他语言写的代码进行交互。在这个示例项目中,...
本示例“AndroidStudio jni 示例”显然是为了帮助初学者理解如何在Android Studio项目中使用JNI技术。下面将详细介绍这个主题,并提供详细的步骤和知识点。 1. **JNI简介**: JNI允许Java应用程序调用本地(非Java...
【Android Studio 数组传递 JNI 示例程序】 在Android开发中,JNI(Java Native Interface)是一种让Java代码调用本地(C/C++)代码的技术,它极大地扩展了Android应用的性能和功能。本示例程序主要讲解如何在...
本篇文章将深入探讨Android学习中的JNI示例代码。 JNI的核心在于它的接口,它为Java程序员提供了一种方式来编写C++代码,这些代码可以被Java虚拟机(JVM)直接调用。在Android平台上,JNI通常用于优化性能,特别是...
总结一下,这个“非常不错的JNI示例程序”主要涵盖了以下几个关键知识点: 1. **JNI基本结构**:Java源代码、头文件、本地代码、动态链接库以及加载库的过程。 2. **JNI函数调用**:如何使用`JNIEnv`指针调用Java...
jni示例vs2005 c++实现,有c++项目源文件,供大家参照,在java目录中直接运行,java TestJni 出效果!
在这个"Coco2dx JNI示例,java c++相互调用"的项目中,我们将深入探讨如何在Cocos2dx游戏引擎中使用JNI实现Java和C++之间的通信。 1. **JNI基础** JNI是Java平台提供的一个标准接口,它允许Java代码调用本地(非...
JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都是必要的,比如调用操作系统API、优化性能关键部分或者利用已有的C/C++库。本DEMO将向你...
在本示例中,我们有两个JNI的实例,分别展示了如何实现一个无参数无返回值的本地方法和一个带有参数及返回值的本地方法。通过这两个示例,我们可以深入理解JNI的工作原理和使用方式。 首先,`nativeHello.dll`和`...
本示例将深入探讨如何在Android应用中使用JNI来调用C语言编写的代码。 首先,JNI的核心概念是Java本地接口,它为Java虚拟机提供了一个桥梁,使得Java应用程序能够调用本地方法(非Java编写的方法)。在Android中,...
总结起来,Android JNI示例让我们有机会学习和实践Java与C/C++的交互,理解JNI的工作原理,以及如何在Android应用中使用本地代码提高性能。通过实际操作,我们可以更深入地掌握Android应用的开发技巧,拓宽技术视野...
学习和理解这个示例,不仅能够帮助你掌握JNI的基本用法,还能让你了解到Android应用如何与原生代码交互,这对于性能优化、游戏开发、以及利用第三方C/C++库等场景非常有用。通过实践,你可以逐步掌握NDK和JNI的高级...
本文提供的两个rar文件,`jniWin32.rar`和`jni.rar`,可能包含了与Windows平台相关的JNI示例代码,帮助读者更具体地了解JNI在实际操作中的运用。通过学习这些实例,开发者可以进一步提升在Java中使用JNI的能力,解决...
1.) 在项目根目录下创建jni目录,下面是要放进去的第一个文件Android.mk LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := main_jni #LOCAL_CFLAGS := LOCAL_SRC_FILES := main.cpp #LOCAL_...
本示例是关于如何在Eclipse开发环境中结合Microsoft Visual Studio 2010来实现JNI程序开发的一个详细教程。 首先,我们需要理解JNI的核心概念。JNI允许Java应用程序调用本地(非Java)代码,比如C++,并反之亦然。...
本资源提供的“java jni简单实例”是一个实际应用JNI的示例,有助于学习和理解JNI的工作原理。 首先,我们来看JNI的核心概念: 1. **本地方法接口**:JNI定义了一套接口,使得Java代码能够声明本地方法(即非Java...
以下是一个简单的JNI示例: ```java // Java类 public class HelloWorld { public native void sayHello(); static { System.loadLibrary("hello"); // 加载本地库 } public static void main(String[] args) ...
博文http://blog.csdn.net/flueky/article/details/50958915的源码工程