- 浏览: 835212 次
- 性别:
- 来自: 哈尔滨
-
文章分类
最新评论
-
doloveme:
$sudo cp MONACO_Linux.ttf /usr/ ...
terminator 的配置 -
腾讯rep:
lowser
RSA加密算法c++简单实现 -
csuhanyong:
好YD啊,好YD
一图流:机械键盘各轴区别 -
doloveme:
1。其中:extman ,extmail下载http://ww ...
Ubuntu下安装postfix+extmail邮件服务器 -
doloveme:
repo sync出现“fatal: '../platform ...
Android 编译环境配置搭建(Ubuntu 12.04)及环境导致编译错误QA
JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI。 JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法。
- 运行环境
CPU : AMD Moblie Athlon 64 3200+
Mem : 1024 MBOS : Windows xp sp2
JDK : java version "1.5.0_06"
IDE : Eclipse 3.1.2 、 Microsoft Visual Studio 2005
- 编写JAVA 代码
//JNITest.java
/**
* @author chunyv
*
*/
public class JNITest {/**
* @param args
*/
static
{
try
{
System.loadLibrary("JNITest");
}
catch(Exception e)
{
System.out.println("load library failure!");
}
}
public native static void version();
public native static void setint(int i);
public native static int getint();
public native static void setstr(String str);
public native static String getstr();
public native static void setgbk(byte[] gbkstr);
public native static byte[] getgbk();
public static void main(String[] args) {
// TODO Auto-generated method stub
String test = "Hello World!";
String test2 = "你好!\n\t\t--chunyv";
System.out.println("Proc Start");
byte[] end = {0};try
{
byte[] mybytedb = test2.getBytes("gbk");
byte[] mybyte = new byte[mybytedb.length + end.length];
System.arraycopy(mybytedb , 0 , mybyte , 0 ,mybytedb.length);
System.arraycopy(end , 0 , mybyte , mybytedb.length , end.length);
JNITest jnitest = new JNITest();
jnitest.setint(6);
System.out.println("setint ok");
System.out.println("get int form library :"+jnitest.getint());
System.out.println("getint ok");
jnitest.setstr(test);
System.out.println("setstr ok");
System.out.println(jnitest.getstr());
System.out.println("getstr ok");
jnitest.setgbk(mybyte);
System.out.println("setgbk ok");
System.out.println(jnitest.getgbk());
System.out.println("getgbk ok");
jnitest.version();
}
catch(Exception e)
{
e.printStackTrace();
}
}}
- 生成 .h 文件
javac JNITest.java
javah JNITest
- 实现 JNITest.h 中的方法
/*
* author chunyv
* JNITest dll
*/#include "JNITest.h"
#include <windows.h>
JNIEXPORT void JNICALL Java_JNITest_version
(JNIEnv *, jclass)
{
printf("JNI Test\n\t\t--chunyv");
}
JNIEXPORT void JNICALL Java_JNITest_setint
(JNIEnv *, jclass, jint ii)
{
i = ii;
}
JNIEXPORT jint JNICALL Java_JNITest_getint
(JNIEnv *, jclass)
{
return i;
}
JNIEXPORT void JNICALL Java_JNITest_setstr
(JNIEnv * env, jclass, jstring jstr)
{
jboolean test = true;memset(str , 0 , sizeof(str));
sprintf_s(str ,env->GetStringUTFChars(jstr,&test));
env->ReleaseStringUTFChars(jstr , NULL);
}JNIEXPORT jstring JNICALL Java_JNITest_getstr
(JNIEnv * env, jclass)
{
return WindowsTojstring(env , str);
}JNIEXPORT void JNICALL Java_JNITest_setgbk
(JNIEnv * env, jclass, jbyteArray myjbyte)
{
memset(strgbk , 0 , sizeof(strgbk));sprintf_s(strgbk ,(char *)env->GetByteArrayElements(myjbyte,0));
}JNIEXPORT jstring JNICALL Java_JNITest_getgbk
(JNIEnv * env, jclass)
{
return WindowsTojstring(env , strgbk);
}jstring WindowsTojstring( JNIEnv* env, char* str_tmp )
{
jstring rtn = 0;
int slen = (int)strlen(str_tmp);
unsigned short * buffer = 0;
if( slen == 0 )
{
rtn = env->NewStringUTF(str_tmp );
}
else
{
int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str_tmp, slen, NULL, 0 );buffer = (unsigned short *)malloc( length*2 + 1 );
if( MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str_tmp, slen, (LPWSTR)buffer, length ) >0 )
{
rtn = env->NewString( (jchar*)buffer, length );
}
}if( buffer )
{
free( buffer );
}return rtn;
}
- 将生成的JNITest.dll 放到 .class 所在的目录 测试
java JNITestProc Start
setint ok
get int form library :6
getint ok
setstr ok
Hello World!
getstr ok
setgbk ok
你好!
--chunyv
getgbk ok
JNI Test
--chunyv
JNI 在 FreeBSD 上的应用
- 运行环境
CPU : Intel(R) Pentium(R) 4 CPU 2.40GHz (2393.94-MHz 686-class CPU)
Mem : 512 MB
OS : FreeBSD 6.2-PRERELEASE
JDK : java version "1.5.0"
IDE : vim + gcc 3.4.4
- java代码同上
- 生成 .h 文件同上
- 实现 JNITest.h 中的方法
/*
* author chunyv
* JNITest so
* add "int FreeBSD2Jstring(char * src ,
* char * dst,
* int * len);" into JNITest.h
*/#include <stdio.h>
#include <iconv.h>
#include <stdlib.h>
#include <string.h>
#include "JNITest.h"int i = 0;
char str[1024];
char strgbk[1024];JNIEXPORT void JNICALL Java_JNITest_version
(JNIEnv *env, jclass jc)
{
printf("JNI Test\n\t\t--chunyv\n");
}
JNIEXPORT void JNICALL Java_JNITest_setint
(JNIEnv * env, jclass jc, jint ii)
{
i = ii;
}
JNIEXPORT jint JNICALL Java_JNITest_getint
(JNIEnv * env, jclass jc)
{
return i;
}
JNIEXPORT void JNICALL Java_JNITest_setstr
(JNIEnv * env, jclass jc, jstring jstr)
{
jboolean test = 1;memset(str , 0 , sizeof(str));
sprintf(str ,(*env)->GetStringUTFChars(env ,jstr,&test));
(*env)->ReleaseStringUTFChars(env ,jstr , NULL);
}JNIEXPORT jstring JNICALL Java_JNITest_getstr
(JNIEnv * env, jclass jc)
{
return (*env)->NewStringUTF(env ,str);
}JNIEXPORT void JNICALL Java_JNITest_setgbk
(JNIEnv * env, jclass jc, jbyteArray myjbyte)
{
memset(strgbk , 0 , sizeof(strgbk));sprintf(strgbk ,(char *)(*env)->GetByteArrayElements(env ,myjbyte,0));
}JNIEXPORT jstring JNICALL Java_JNITest_getgbk
(JNIEnv * env, jclass jc)
{
char test[1024] ;
sprintf(test ,strgbk);
int len = (int ) strlen(strgbk);
if( FreeBSD2Jstring(test , strgbk ,&len ))
{
printf("convert error\n");
return NULL;
}
return (*env)->NewStringUTF(env ,strgbk);
}int FreeBSD2Jstring(char * src ,
char * dst,
int * len)
{
size_t n_in = strlen(src);
size_t n_out = *len+2;
memset(dst , 0 , n_out);
iconv_t test = iconv_open("UTF-8","GBK");
if(test == (iconv_t)-1)
{
printf("iconv open error\n");
return -1;
}
if((size_t)-1 == iconv(test ,(const char **) & src ,&n_in , & dst , &n_out))
{
printf("iconv convert error\n");
return -1;
}
if(test)
{
iconv_close(test);
}*len = n_out;
return 0;
}
- 编译 .c 文件,将生成的库文件放到.class 所在目录并测试 .class
编译库文件
gcc -Wall -fPIC -shared -o libJNITest.so -I /usr/local/diablo-jdk1.5.0/include/ -I /usr/local/diablo-jdk1.5.0/include/freebsd/ -I /usr/local/include/ -liconv -L /usr/local/lib/ JNITest.c
测试 .class
java -Djava.library.path=./ JNITest
- 测试结果
Proc Start
setint ok
get int form library :6
getint ok
setstr ok
Hello World!
getstr ok
setgbk ok
你好!
--chunyv
getgbk ok
JNI Test
--chunyv
JNI在Linux上的使用请参阅 《JNI在FreeBSD上的使用》部分
注:实例仅供参考,转载请注明出处,欢迎交流学习,谢谢!!
发表评论
-
JAVA代码混淆
2016-05-05 18:24 1466JAVA代码混淆 <!--[if !supportL ... -
android 监听状态栏被下拉
2015-12-25 17:23 3499Activity的onWindowFocusChange()方 ... -
android使用mount挂载/system/app为读写权限,删除或替换系统应用
2015-11-27 14:13 4041注意:以下代码中#开头的则为需要执行的shell命令,其他的 ... -
Ubuntu 14.04 文件服务器--samba的安装和配置
2015-11-10 10:49 645jingyan.baidu.com/album/00a07f ... -
intellij 打开工程在每个java文件上 有个红色的无效符
2015-07-24 13:52 1777说明该类不是可编译文件。在project Structure中 ... -
logcat命令详解
2015-07-22 16:34 998Android日志系统提供了记录和查看系统调试信息的功能。日 ... -
gradle打包遇到的错误汇总
2015-07-21 11:32 0错误1:A problem occurred ... -
Android读写XML(下)——创建XML文档
2015-04-29 11:02 624在前面的2篇文章Android读写XML(上)—— pack ... -
Android读写XML(中)——SAX
2015-04-29 10:54 628在Android读写XML(上) ... -
Android读写XML(下)——创建XML文档
2015-04-29 10:52 710在前面的2篇文章Android读写XML(上)—— pack ... -
android:configChanges locale 改语言后,该配置不起作用的原因
2015-03-23 14:38 2546@Override public void on ... -
android.app.Fragment$InstantiationException 解决办法
2015-03-23 13:46 1425android.app.Fragment$Instantia ... -
linux 查看内存
2015-02-10 13:08 7551、free监控内存使用情况 #free 2、watc ... -
android fastboot 刷机 指令
2015-01-19 18:31 1539原生bootloader:bootloader-gro ... -
[Android实例] android中进行https连接的方式的详解 (转发)
2015-01-09 15:50 701x 如果不需要验证服务器端证书, ... -
编译android源码apk是否生成odex方法
2014-10-20 17:19 1660其实Android系统默认的配置是,如果没有指定DISABL ... -
关于android源码中的APP编译时引用隐藏的API出现的问题
2014-10-20 15:36 863今天在编译android源码中的计算器APP时发现,竟然无法 ... -
Android系统进程Zygote启动过程的源代码分析
2014-09-17 10:09 522在Android系统中, ... -
Handler和HandlerThread
2014-09-16 16:58 7031.什么是Handler? SDK中关于Handler的说 ... -
怎样识别三洋18650锂电池电芯
2014-09-01 09:52 1137浏览:20384 | 更新:2011-03 ...
相关推荐
**标题:“JNA—JNI终结者”** 这篇文章探讨的主题是Java Native Access (JNA) 和 Java Native Interface (JNI),两者都是Java平台上的技术,用于在Java应用程序中调用本地(非Java)代码。它们允许Java程序员与...
Chap9:如何编写jni方法(转载)... 55 1、实例一:在jni中调用标准c中自带的函数printf(): 57 2、实例二、调用c 语言用户定义的函数... 58 3、实例三、在jni函数中访问java类中的对象实例域... 58 4、实例四:在...
【Android NDK 开发】Visual Studio 2019 使用 CMake 开发 JNI 动态库 ( 动态库编译配置 | JNI 头文件导入 | JNI 方法命名规范 ) 博客地址 : https://hanshuliang.blog.csdn.net/article/details/104068609 博客...
JNI,全称为Java Native ...版权声明:本文为CSDN博主「clever101」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/clever101/article/details/125938242
Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 Chap 3:javah命令帮助信息......Chap 4:用javah产生一个...Chap5:使用JNI技术实现java程序调用第三方dll(c/c++)文件的功能... 47 Chap9:如何编写jni方法(转载)... 55
转载几篇介绍android jni开发方法的文章,有介绍基础的,有介绍方法的,也有实例可参考。
版权声明:本文为CSDN博主「韩曙亮」的原创文章,遵循 CC 4.0 BY-NC-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://hanshuliang.blog.csdn.net/article/details/104108556
《JAVA NATIVE VC Com 的转载连载文章》这篇文章主要探讨了如何在Java中使用Native接口与VC++编译的DLL进行交互,以及DLL的基本概念和创建方法。以下是对这些知识点的详细说明: 1. **DLL (Dynamic Link Library)**...
网站通常会有一套完整的版权保护机制,包括版权声明、侵权举报流程、快速删除机制等,以维护创作者的合法权益,同时也提醒用户要尊重版权,合法使用网络资源。 #### 四、专业资源的获取与利用 部分内容还提到了...
三、以下列出了在使用JDBC来连接Oracle数据库时可以使用的一些技巧,这些技巧能够使我们更好地发挥系统的性能和实现更多的功能(系转载)。 1、在客户端软件开发中使用Thin驱动程序 在开发Java软件方面,Oracle...
经典的JNI的基础之上的一个框架。 JNA项目地址:https://jna.dev.java.net/ JNA使Java调用原生函数就像.NET上的P/Invoke一样方便、快捷。 JNA的功能和P/Invoke类似,但编写方法与P/Invoke截然不同。JNA没有使用...
知识体系总结 如果你感到委屈,证明你还有底线;如果你感到迷茫,证明你还有追求;如果你感到痛苦,证明你还有力气;...NDK JNI学习 文章标题 状态 原创,转载 已发布 原创 已发布 原创 自定义视图 文章标题 状态 原创
对于.so文件,需要根据项目支持的CPU架构,将它们放入对应的`jniLibs`目录下,如`jniLibs/armeabi`、`jniLibs/armeabi-v7a`等。 接下来,注册应用。在微信开放平台上创建应用并获取AppID,然后在AndroidManifest....
因为工作需要写一份SO文件,作为手机硬件IC读卡和APK交互的桥梁,也是中间件,看了网上有说到JNI接口技术实现,这里转载了一个实例 1 // 用JNI实现 2 // 实例: 3 4 // 创建HelloWorld.java 5 class HelloWorld...
3. NDK带来的益处:NDK可以让C或C++语言开发者快速加入Android平台的应用开发,同时也能让Java开发者通过JNI(Java Native Interface)更加方便地调用底层操作和处理性能敏感的任务。 4. 开发环境的部署:文档中...