如何编译Java本地库?

4
我希望这是正确的词,"编译"。我在这里问,因为我甚至不确定要搜索什么才能获得更多信息。
我想使用这个库:http://jiggawatt.org/badc0de/android/#gifflen 下载提供了一堆.cpp和.h文件。据我所知,我需要一个.so文件才能使用System.loadLibrary(libName)
我无法弄清楚如何将这些C++文件编译成必要的.so文件?

1
尝试使用 g++ mylibrary.cpp -o mylibrary.so -shared -fPIC - Kerrek SB
顺便说一下,那不是“Java本地库”,而是“本地库”。 - m0skit0
@KerrekSB 好的,我已经下载/安装了MinGW并运行了上面的命令。它有效了。但是,现在当我尝试使用库时,我得到了“无法在AMD 64位平台上加载IA 32位.dll”的错误。我该如何解决这个问题,需要设置哪些参数或其他东西吗? - yesbutmaybeno
1
@FTLRalph:也许加上“-m64”? - Kerrek SB
@KerrekSB 搞定了。我下载了MinGW 64并更新了PATH变量,但没有重启。还在使用旧编译器构建。现在一切都好了,谢谢! - yesbutmaybeno
不用担心,如果你的操作系统需要重新启动以更新环境变量,也许这说明了一些关于你的操作系统的问题... :-S - Kerrek SB
1个回答

3
您可以使用以下命令创建共享对象文件。
gcc -shared -fpic -o <so-file-name>.so a.c b.c

在Mac OS X上,使用以下命令进行编译:
g++ -dynamiclib -flat_namespace myclass.cc -o myclass.so
g++ class_user.cc -o class_user

在Linux下,使用以下方式进行编译:

g++ -fPIC -shared myclass.cc -o myclass.so
g++ class_user.cc -ldl -o class_user

参考资料:

Linux上的C++动态共享库

使用gcc命令行从.c文件构建.so文件

示例教程

运行.so文件的Java样例代码:

HelloJNI.c

#include <jni.h>
#include <stdio.h>
#include "HelloJNI.h"

JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj) {
   printf("Hello World!\n");
   return;
}

HelloJNI.java

public class HelloJNI {
   static {
      System.loadLibrary("hello"); // hello.dll (Windows) or libhello.so (Unixes)
   }
   // A native method that receives nothing and returns void
   private native void sayHello();

   public static void main(String[] args) {
      new HelloJNI().sayHello();  // invoke the native method
   }
}

使用 .java 文件运行上述 .c 文件的步骤

javac HelloJNI

javah HelloJNI

gcc -shared -fpic -o libhello.so -I/usr/java/default/include -I/usr/java/default/include/linux HelloJNI.c

java  -Djava.library.path=. HelloJNI

请注意,javah在Java 8中已被弃用:https://openjdk.java.net/jeps/313 - WaffleSouffle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接