android c java库_《Android进阶》之第一篇 在Java中调用C库函数

在Java代码中通过JNI调用C函数的步骤如下:

第一步:编写Java代码

1 classHelloJNI{2 native voidprintHello();3 native voidprintString(String str);4

5 static {System.loadLibrary("hellojni");}6

7 public static voidmain(String args[]) {8 HelloJNI myJNI = newHelloJNI();9

10 myJNI.printHello();11 myJNI.printString("Hello World from c fun");12

13 }14

15 }

第二步: 编译Java代码

javac HelloJNI.java   生成HelloJNI.class文件

第三步: 生成C语言头文件

javah HelloJNI   生成HelloJNI.h头文件

/*DO NOT EDIT THIS FILE - it is machine generated*/#include

/*Header for class HelloJNI*/#ifndef _Included_HelloJNI

#define _Included_HelloJNI

#ifdef __cplusplus

extern"C"{

#endif/** Class: HelloJNI

* Method: printHello

* Signature: ()V*/JNIEXPORTvoidJNICALL Java_HelloJNI_printHello

(JNIEnv*, jobject);/** Class: HelloJNI

* Method: printString

* Signature: (Ljava/lang/String;)V*/JNIEXPORTvoidJNICALL Java_HelloJNI_printString

(JNIEnv*, jobject, jstring);

#ifdef __cplusplus

}

#endif

#endif

第四步: 编写C代码

要注意c代码必须得依照上面头文件的方式编写,和普通的c函数有区别

1 #include"HelloJNI.h"

2 #include

3

4 JNIEXPORT void JNICALL Java_HelloJNI_printHello(JNIEnv *env, jobject obj) {5 printf("Hello World!\n");6 return;7 }8

9 JNIEXPORT void JNICALL Java_HelloJNI_printString(JNIEnv * env, jobject obj, jstring string) {10 const char *str = (*env)->GetStringUTFChars(env,string,0);11 printf("%s!\n",str);12 return;13 }

第五步: 生成C共享库

CodeBlocks下:

File - New - Project - Shared library - Go

因为HelloJNI.h中有这样的一句#include ,标准的库文件下是没有这个文件的,但这个文件可以在JDK的安装目录下面找到

b167d4e10fdde3ed599594546ae83f0b.png

为了能够顺利编译,需要把相应文件复制到C编译器的头文件存放处,像下面这样:

56181df54965f30b19ec68b30690aba6.png

编译生成C共享库文件:

90dba8375d6798970d79eda015966fec.png

不过CodeBlocks默认生成的文件前面加了前缀lib,需要手动去掉,但运行是还是出了问题:

1 D:\hixin\C>java HelloJNI2 Exception in thread "main"java.lang.UnsatisfiedLinkError: D:\hixin\C\hellojni.d3 ll: Can't load IA 32-bit .dll on a AMD 64-bit platform

4 at java.lang.ClassLoader$NativeLibrary.load(Native Method)5 at java.lang.ClassLoader.loadLibrary0(Unknown Source)6 at java.lang.ClassLoader.loadLibrary(Unknown Source)7 at java.lang.Runtime.loadLibrary0(Unknown Source)8 at java.lang.System.loadLibrary(Unknown Source)9 at HelloJNI.(HelloJNI.java:5)

大意是生成的dll不是64位的,看了网上最新版的vs似乎是可以生成64位dll,算啦不纠结这个啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值