System.loadLibrary()在suse机器上加载时出错

时间:2014-09-17 13:51:11

标签: java android java-native-interface

我正在linux(SuSE)上编写一个Java应用程序,它应该使用JNI与本机库进行通信。本机库已使用Android NDK构建。

lib一直使用命令ndk-build创建。 Android.mk看起来像这样:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := hello-jni.c

include $(BUILD_SHARED_LIBRARY)

Application.mk就像这样

APP_ABI := x86
APP_STL := system

正在为x86环境构建.so

通过System.loadLibrary()加载此库时,会出现以下错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError.
libhello-jni.so: libstdc++.so: cannot open shared object file: No such file or directory

尝试了许多事情,包括设置APP_STL。但是错误没有得到解决。

我正在使用ndk-build,因为最后整件事必须转移到Android,这需要使用ndk创建lib。

3 个答案:

答案 0 :(得分:0)

根据你的模块名称LOCAL_MODULE:= hello-jni,你应该使用

的System.loadLibrary(" HELLO-JNI&#34);

答案 1 :(得分:0)

由于多种原因,您无法使用NDK构建库以供在普通Linux上使用,包括C库及其关联的动态链接器不同且库命名约定不同。通常你也会有一个不同的处理器(尽管NDK现在支持开发机器中可能存在的大部分),即使处理器匹配,也可能是一个微妙的不同ABI。

您仍然可以实现在桌面上测试jni代码的目标,您只需要使用针对桌面Linux环境的工具链(使用适当的jni使用设置)来构建它,然后使用NDK为您的Android目标。

答案 2 :(得分:0)

感谢。我能够构建lib(使用gcc),加载它并从java调用CPP接口api(从命令行使用-java myMainClass)   但是当我从eclipse IDE(来自ADT)运行相同的java源代码时,它会给出错误: “         线程“main”中的异常java.lang.UnsatisfiedLinkError:myMainClass.printLine()Ljava / lang / String;     at myMainClass.printLine(Native Method)     在myMainClass.main(myMainClass.java:26) “ 我在IDE中设置了lib路径,如下所示: 属性 - > Java构建路径 - >源标签 - >本机库位置

java源代码如下:

   import java.lang.System;
    import java.lang.String;


    public class myMainClass {


        // native functions
        public native String printLine();
        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub

                System.out.println("Hello world! in java");
                myMainClass m = new myMainClass();
                String s1 = m.printLine();

                System.out.println(s1);

        }

        static {
        System.loadLibrary("hello");
               }
    }

CPP来源如下:

#include <stdio.h>
#include <iostream>
#include "myMainClass.h"

JNIEXPORT jstring JNICALL Java_myMainClass_printLine
  (JNIEnv *env, jobject object)
{
        return env->NewStringUTF("Hello from JNI !");
}