可以通过loadLibrary使用有效名称加载本机库。例如,对于Linux家族的lib XXXX
.so,您的hellolib.so应该重命名为libhello.so。顺便说一下,我使用jni开发Java,我将实现和本地接口(.c或.cpp)分开。
static { System.loadLibrary("hello"); // will load libhello.so}实现标头(HelloImpl.h):
#ifndef _HELLO_IMPL_H#define _HELLO_IMPL_H#ifdef __cplusplus extern "C" {#endif void sayHello ();#ifdef __cplusplus }#endif#endifHelloImpl.cpp:
#include "HelloImpl.h"#include <iostream>using namespace std;void sayHello () { cout << "Hello World!" << endl; return;}Hello.c(我更喜欢在c中编译jni):
#include <jni.h>#include "Hello.h"#include "HelloImpl.h"JNIEXPORT void JNICALL Java_Hello_sayHello (JNIEnv *env, jobject obj) { sayHello(); return;}最后,我们可以按以下步骤进行编译:
- 编译obj(生成HelloImpl.o)
g ++ -c -I“ / opt / java / include” -I“ / opt / java / include / linux”
HelloImpl.cpp
- 用.o编译jni
g ++ -I“ / opt / java / include” -I“ / opt / java / include / linux” -o
libhello.so -shared -Wl,-soname,hello.so Hello.c HelloImpl.o -static -lc
在第2步中,我们使用g ++进行编译。这个非常重要。您可以看到如何混合使用C和C
++
编译后,可以检查使用nm命名的函数:
$ nm libhello.so |grep say00000708 T Java_Hello_sayHello00000784 t _GLOBAL__I_sayHello00000718 T sayHello
有一个标记为T的Java_Hello_sayHello。它应完全等于您的本机方法名称。如果一切正常。您可以运行它:
$ java -Djava.library.path=. HelloHello World!



