如何把JAVA工程 编译成.SO文件

如何把JAVA工程 编译成.SO文件,第1张

1,写一个java文件,声明一个native 方法,例如public native void test()2,把它编译成class文件 3,使用javah 这个class来生成cpp的头文件 4,实现头文件里面那些函数 4,用ndk编译生成动态库 其中1,想生成几个就写几个native方法。

可以直接在android工程下使用,因为android就是linux内核。

android的NDK开发需要在linux下进行: 因为需要把C/C++编写的代码生成能在arm上运行的.so文件,这就需要用到交叉编译环境,而交叉编译需要在linux系统下才能完成。

2.安装android-ndk开发包,这个开发包可以在google android : 通过这个开发包的工具才能将android jni 的C/C++的代码编译成库

3.android应用程序开发环境: 包括eclipse、java、 android sdk、 adt等。

NDK编译步骤:

选择 ndk 自带的例子 hello-jni ,位于E:\android-ndk-r5\samples\hello-jni( 根据具体的安装位置而定 ) 。

2.运行 cygwin ,输入命令 cd /cygdrive/e/android-ndk-r5/samples/hello-jni ,进入到 E:\android-ndk-r5\samples\hello-jni 目录。

3.输入 $NDK/ndk-build ,执行成功后,它会自动生成一个 libs 目录,把编译生成的 .so 文件放在里面。 ($NDK是调用我们之前配置好的环境变量, ndk-build 是调用 ndk 的编译程序 )

4.此时去 hello-jni 的 libs 目录下看有没有生成的 .so 文件,如果有,ndk 就运行正常啦。

1 、编写java代码

package net.lu;

public class HelloJNI {

static {

System.loadLibrary("HelloJNI")

}

public native static int get()

public native static void set(int i)

public static void main(String[] args) {

HelloJNI test = new HelloJNI()

test.set(10)

System.out.println(test.get())

}

}

2、在HelloJNI.java文件所在目录下编译.java文件。

javac HelloJNI.java

3、生成.h头文件,需要注意的是,要在src目录层生成文件

... src] # javah -jni net.lu.HelloJNI

4、编写.c 文件

#include "net_wangliping_HelloJNI.h"

int i = 0

JNIEXPORT jint JNICALL Java_net_wangliping_HelloJNI_get(JNIEnv *env, jclass jc)

{

return i

}

JNIEXPORT void JNICALL Java_net_wangliping_HelloJNI_set(JNIEnv *env, jclass jc, jint j)

{

i = 2*j

}

5、生成.so文件

[root@turbolinux src]# gcc -I/usr/java/jdk1.5.0_13/include/linux -I/usr/java/jdk1.5.0_13/include -fPIC -shared -o libHelloJNI.so HelloJNI.c

6、eclipse 调用SO文件

最简单的方式,调用 System.out.println(System.getProperty("java.library.path"))

得到/usr/java/jdk1.5.0_13/jre/lib/i386,将SO文件放在该目录下

运行java程序,输出了由C语言函数计算出的结果


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/11706190.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存