如何编译Java本机库?

时间:2015-03-23 18:11:11

标签: java android c++

我希望这是正确的用词,"编译。"我在这里问,因为我甚至不确定Google可以获取更多信息。

我想在这里使用这个库:http://jiggawatt.org/badc0de/android/#gifflen

下载提供了一堆.cpp和.h文件。据我所知,我需要一个.so文件才能使用System.loadLibrary(libName)

我能弄清楚如何将这些C ++文件编译成必要的.so文件?

1 个答案:

答案 0 :(得分:1)

您可以使用下面提到的命令创建共享对象文件。

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

<强>参考文献:

C++ Dynamic Shared Library on Linux

Build .so file from .c file using gcc command line

Sample tutorial

使用带命令的java运行.so文件的示例代码:

<强> 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