Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
未满足链接错误:java.library.path中没有库文件_Java_C_Bash_Gcc_Java Native Interface - Fatal编程技术网

未满足链接错误:java.library.path中没有库文件

未满足链接错误:java.library.path中没有库文件,java,c,bash,gcc,java-native-interface,Java,C,Bash,Gcc,Java Native Interface,我有一个这样的目录结构 . --compile_c.sh --compile_java.sh --config.sh --execute_java.sh --run.sh --src --ccode --jnitest_SimpleJNITest.h --rtm_simple.c --jnitest --SimpleJNITest.java --lib --rtm_simple.so --classes --SimpleJNITest.class 当rt

我有一个这样的目录结构

.
--compile_c.sh
--compile_java.sh
--config.sh
--execute_java.sh
--run.sh
--src
  --ccode
    --jnitest_SimpleJNITest.h
    --rtm_simple.c
  --jnitest
    --SimpleJNITest.java
--lib
  --rtm_simple.so
--classes
  --SimpleJNITest.class
rtm_simple.c
中充实了
native
方法时,如何正确运行
simplejtest

目前,我已经定义了

config.sh

targetDir="classes"
libDir="lib"
srcDir="src"
MainPackage="jnitest"
Main="SimpleJNITest"

ccodeDir="ccode"
cFileName="rtm_simple"

jdkDir="/home/user/local/java/jdk1.7.0_65"

mkdir -p "$targetDir"
mkdir -p "$libDir"
#!/bin/bash

source compile_java.sh

javah -d "${srcDir}/${ccodeDir}" -cp "$targetDir" -jni "${MainPackage}.${Main}"

source compile_c.sh

source execute_java.sh
#!/bin/bash

source config.sh

javac -d "$targetDir" -sourcepath "$srcDir" -cp "${targetDir}:${libDir}/*" "${srcDir}/${MainPackage}/${Main}.java"
#!/bin/bash

source config.sh

cFile="${srcDir}/${ccodeDir}/${cFileName}.c"
soFile="${libDir}/${cFileName}.so"

gcc -g -shared -fpic -I "${jdkDir}/include" -I "${jdkDir}/include/linux" $cFile -o $soFile 
#!/bin/bash
source config.sh

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${libDir}"

java -cp "${targetDir}:${libDir}/*" "${MainPackage}.${Main}"
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class jnitest_SimpleJNITest */

#ifndef _Included_jnitest_SimpleJNITest
#define _Included_jnitest_SimpleJNITest
#ifdef __cplusplus
extern "C" {
#endif
#undef jnitest_SimpleJNITest_NOF_ITERATIONS
#define jnitest_SimpleJNITest_NOF_ITERATIONS 100000L
/*
* Class:     jnitest_SimpleJNITest
* Method:    nofAborts
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_jnitest_SimpleJNITest_nofAborts
  (JNIEnv *, jobject, jint);

#ifdef __cplusplus
}
#endif
#endif
我正试着逃跑

run.sh

targetDir="classes"
libDir="lib"
srcDir="src"
MainPackage="jnitest"
Main="SimpleJNITest"

ccodeDir="ccode"
cFileName="rtm_simple"

jdkDir="/home/user/local/java/jdk1.7.0_65"

mkdir -p "$targetDir"
mkdir -p "$libDir"
#!/bin/bash

source compile_java.sh

javah -d "${srcDir}/${ccodeDir}" -cp "$targetDir" -jni "${MainPackage}.${Main}"

source compile_c.sh

source execute_java.sh
#!/bin/bash

source config.sh

javac -d "$targetDir" -sourcepath "$srcDir" -cp "${targetDir}:${libDir}/*" "${srcDir}/${MainPackage}/${Main}.java"
#!/bin/bash

source config.sh

cFile="${srcDir}/${ccodeDir}/${cFileName}.c"
soFile="${libDir}/${cFileName}.so"

gcc -g -shared -fpic -I "${jdkDir}/include" -I "${jdkDir}/include/linux" $cFile -o $soFile 
#!/bin/bash
source config.sh

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${libDir}"

java -cp "${targetDir}:${libDir}/*" "${MainPackage}.${Main}"
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class jnitest_SimpleJNITest */

#ifndef _Included_jnitest_SimpleJNITest
#define _Included_jnitest_SimpleJNITest
#ifdef __cplusplus
extern "C" {
#endif
#undef jnitest_SimpleJNITest_NOF_ITERATIONS
#define jnitest_SimpleJNITest_NOF_ITERATIONS 100000L
/*
* Class:     jnitest_SimpleJNITest
* Method:    nofAborts
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_jnitest_SimpleJNITest_nofAborts
  (JNIEnv *, jobject, jint);

#ifdef __cplusplus
}
#endif
#endif
在哪里

编译java.sh

targetDir="classes"
libDir="lib"
srcDir="src"
MainPackage="jnitest"
Main="SimpleJNITest"

ccodeDir="ccode"
cFileName="rtm_simple"

jdkDir="/home/user/local/java/jdk1.7.0_65"

mkdir -p "$targetDir"
mkdir -p "$libDir"
#!/bin/bash

source compile_java.sh

javah -d "${srcDir}/${ccodeDir}" -cp "$targetDir" -jni "${MainPackage}.${Main}"

source compile_c.sh

source execute_java.sh
#!/bin/bash

source config.sh

javac -d "$targetDir" -sourcepath "$srcDir" -cp "${targetDir}:${libDir}/*" "${srcDir}/${MainPackage}/${Main}.java"
#!/bin/bash

source config.sh

cFile="${srcDir}/${ccodeDir}/${cFileName}.c"
soFile="${libDir}/${cFileName}.so"

gcc -g -shared -fpic -I "${jdkDir}/include" -I "${jdkDir}/include/linux" $cFile -o $soFile 
#!/bin/bash
source config.sh

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${libDir}"

java -cp "${targetDir}:${libDir}/*" "${MainPackage}.${Main}"
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class jnitest_SimpleJNITest */

#ifndef _Included_jnitest_SimpleJNITest
#define _Included_jnitest_SimpleJNITest
#ifdef __cplusplus
extern "C" {
#endif
#undef jnitest_SimpleJNITest_NOF_ITERATIONS
#define jnitest_SimpleJNITest_NOF_ITERATIONS 100000L
/*
* Class:     jnitest_SimpleJNITest
* Method:    nofAborts
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_jnitest_SimpleJNITest_nofAborts
  (JNIEnv *, jobject, jint);

#ifdef __cplusplus
}
#endif
#endif
编译_c.sh

targetDir="classes"
libDir="lib"
srcDir="src"
MainPackage="jnitest"
Main="SimpleJNITest"

ccodeDir="ccode"
cFileName="rtm_simple"

jdkDir="/home/user/local/java/jdk1.7.0_65"

mkdir -p "$targetDir"
mkdir -p "$libDir"
#!/bin/bash

source compile_java.sh

javah -d "${srcDir}/${ccodeDir}" -cp "$targetDir" -jni "${MainPackage}.${Main}"

source compile_c.sh

source execute_java.sh
#!/bin/bash

source config.sh

javac -d "$targetDir" -sourcepath "$srcDir" -cp "${targetDir}:${libDir}/*" "${srcDir}/${MainPackage}/${Main}.java"
#!/bin/bash

source config.sh

cFile="${srcDir}/${ccodeDir}/${cFileName}.c"
soFile="${libDir}/${cFileName}.so"

gcc -g -shared -fpic -I "${jdkDir}/include" -I "${jdkDir}/include/linux" $cFile -o $soFile 
#!/bin/bash
source config.sh

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${libDir}"

java -cp "${targetDir}:${libDir}/*" "${MainPackage}.${Main}"
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class jnitest_SimpleJNITest */

#ifndef _Included_jnitest_SimpleJNITest
#define _Included_jnitest_SimpleJNITest
#ifdef __cplusplus
extern "C" {
#endif
#undef jnitest_SimpleJNITest_NOF_ITERATIONS
#define jnitest_SimpleJNITest_NOF_ITERATIONS 100000L
/*
* Class:     jnitest_SimpleJNITest
* Method:    nofAborts
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_jnitest_SimpleJNITest_nofAborts
  (JNIEnv *, jobject, jint);

#ifdef __cplusplus
}
#endif
#endif
执行java.sh

targetDir="classes"
libDir="lib"
srcDir="src"
MainPackage="jnitest"
Main="SimpleJNITest"

ccodeDir="ccode"
cFileName="rtm_simple"

jdkDir="/home/user/local/java/jdk1.7.0_65"

mkdir -p "$targetDir"
mkdir -p "$libDir"
#!/bin/bash

source compile_java.sh

javah -d "${srcDir}/${ccodeDir}" -cp "$targetDir" -jni "${MainPackage}.${Main}"

source compile_c.sh

source execute_java.sh
#!/bin/bash

source config.sh

javac -d "$targetDir" -sourcepath "$srcDir" -cp "${targetDir}:${libDir}/*" "${srcDir}/${MainPackage}/${Main}.java"
#!/bin/bash

source config.sh

cFile="${srcDir}/${ccodeDir}/${cFileName}.c"
soFile="${libDir}/${cFileName}.so"

gcc -g -shared -fpic -I "${jdkDir}/include" -I "${jdkDir}/include/linux" $cFile -o $soFile 
#!/bin/bash
source config.sh

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${libDir}"

java -cp "${targetDir}:${libDir}/*" "${MainPackage}.${Main}"
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class jnitest_SimpleJNITest */

#ifndef _Included_jnitest_SimpleJNITest
#define _Included_jnitest_SimpleJNITest
#ifdef __cplusplus
extern "C" {
#endif
#undef jnitest_SimpleJNITest_NOF_ITERATIONS
#define jnitest_SimpleJNITest_NOF_ITERATIONS 100000L
/*
* Class:     jnitest_SimpleJNITest
* Method:    nofAborts
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_jnitest_SimpleJNITest_nofAborts
  (JNIEnv *, jobject, jint);

#ifdef __cplusplus
}
#endif
#endif
(也尝试了
java-Djava.library.path=“$LD\u library\u path:$libDir”-cp“${targetDir}:${libDir}/*”${MainPackage}.${Main}”

输出

$ ./run.sh
Exception in thread "main" java.lang.UnsatisfiedLinkError: no rtm_simple in java.library.path
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)
        at java.lang.Runtime.loadLibrary0(Runtime.java:870)
        at java.lang.System.loadLibrary(System.java:1122)
        at jnitest.SimpleJNITest.main(SimpleJNITest.java:17)
代码:

SimpleJNITest.java

package jnitest;

public class SimpleJNITest{

    public static final int NOF_ITERATIONS = 100000;

    public native int nofAborts(int nofTransactions);

    public void test(){

        int nofAborts = nofAborts(NOF_ITERATIONS);
        System.out.println(String.format("successfully completed %d transactions and had to retry %d times",nofAborts));
    }


    public static void main(String[] args) {
        System.loadLibrary("rtm_simple");
        new SimpleJNITest().test();
    }
}
(还尝试使用
System.loadLibary(“rtm_simple.so”);

jnitest\u SimpleJNITest.h

targetDir="classes"
libDir="lib"
srcDir="src"
MainPackage="jnitest"
Main="SimpleJNITest"

ccodeDir="ccode"
cFileName="rtm_simple"

jdkDir="/home/user/local/java/jdk1.7.0_65"

mkdir -p "$targetDir"
mkdir -p "$libDir"
#!/bin/bash

source compile_java.sh

javah -d "${srcDir}/${ccodeDir}" -cp "$targetDir" -jni "${MainPackage}.${Main}"

source compile_c.sh

source execute_java.sh
#!/bin/bash

source config.sh

javac -d "$targetDir" -sourcepath "$srcDir" -cp "${targetDir}:${libDir}/*" "${srcDir}/${MainPackage}/${Main}.java"
#!/bin/bash

source config.sh

cFile="${srcDir}/${ccodeDir}/${cFileName}.c"
soFile="${libDir}/${cFileName}.so"

gcc -g -shared -fpic -I "${jdkDir}/include" -I "${jdkDir}/include/linux" $cFile -o $soFile 
#!/bin/bash
source config.sh

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${libDir}"

java -cp "${targetDir}:${libDir}/*" "${MainPackage}.${Main}"
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class jnitest_SimpleJNITest */

#ifndef _Included_jnitest_SimpleJNITest
#define _Included_jnitest_SimpleJNITest
#ifdef __cplusplus
extern "C" {
#endif
#undef jnitest_SimpleJNITest_NOF_ITERATIONS
#define jnitest_SimpleJNITest_NOF_ITERATIONS 100000L
/*
* Class:     jnitest_SimpleJNITest
* Method:    nofAborts
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_jnitest_SimpleJNITest_nofAborts
  (JNIEnv *, jobject, jint);

#ifdef __cplusplus
}
#endif
#endif
/*不要编辑此文件-它是机器生成的*/
#包括
/*类jnitest\u SimpleJNITest的标头*/
#如果NDEF包括简单测试
#定义\u包含\u jnitest\u SimpleJNITest
#ifdef_uucplusplus
外部“C”{
#恩迪夫
#未定义jnitest_SimpleJNITest_NOF_迭代
#定义jnitest\u SimpleJNITest\u NOF\u迭代100000L
/*
*类:jnitest\u SimpleJNITest
*方法:诺法波特
*签字:(一)一
*/
JNIEXPORT jint JNICALL Java_jnitest_SimpleJNITest_nofAborts
(JNIEnv*,jobject,jint);
#ifdef_uucplusplus
}
#恩迪夫
#恩迪夫
rtm_simple.c

#include <jni.h>
#include "jnitest_SimpleJNITest.h"

JNIEXPORT jint JNICALL
Java_jnitest_SimpleJNITest_nofAborts(JNIEnv* env, jobject obj, jint nof_iterations){
    volatile int abort_counter = 0;
    volatile int i = 0;
    while (i < nof_iterations) {
        __asm__ __volatile__ (
            "xbegin 1f" /*1f: local label 1, look forward to find first*/
                :"+rm"(i) /*artificial dependency to prevent re-ordering*/
        ); 

        ++i;

        __asm__ __volatile__ (
            "xend\n\t"
            "jmp 2f\n" /*not aborted ==> jump to local label 2*/
            "1:\n\t" /*local label 1 (jumped to when transaction is aborted)*/
            :"+rm"(abort_counter) /*artificial dependency*/
            :"rm"(i) /*artificial dependency*/
        );

        ++abort_counter;

        __asm__ __volatile__ (
            "2:" /*local label 2 (jumped to when transactoin is NOt aborted)*/
            :"+rm"(abort_counter) /*artificial dependency*/
            :"rm"(i) /*artificial dependency*/
        );
    }

    if(i != nof_iterations) return -1;
    return abort_counter;
}
#包括
#包括“jnitest_SimpleJNITest.h”
JNIEXPORT jint JNICALL
Java_jnitest_SimpleJNITest_nofAborts(JNIEnv*env、jobject obj、jint nof_迭代){
volatile int abort_计数器=0;
挥发性int i=0;
而(i跳转到本地标签2*/
“1:\n\t”/*本地标签1(事务中止时跳到)*/
:“+rm”(中止计数器)/*人工依赖*/
:“rm”(i)/*人为依赖*/
);
++中止计数器;
__asm\uuuuuu挥发性(
“2://*本地标签2(未中止Transaction时跳到)*/
:“+rm”(中止计数器)/*人工依赖*/
:“rm”(i)/*人为依赖*/
);
}
如果(i!=nof_迭代)返回-1;
返回中止计数器;
}

如果要指定文件名,则需要使用,而不是方法<代码>加载库以平台相关的方式转换指定的名称。在您的系统上,可能添加了
lib
前缀和
。因此
后缀,但这意味着无论您如何调用
loadLibrary
,它都无法加载名为
rtm\u simple的文件。因此
即使它位于库搜索路径上。或者换句话说,如果您确实想使用
loadLibrary
,则需要将文件重命名为
librtm\u simple.so


如果在
strace-fF

下运行JVM,您可以看到JVM使用的路径。建议您将System.loadLibrary()放在SimpleJNITest类的静态块中。在main中创建SimpleJNITest对象时,您可能需要更加明确

public class SimpleJNITest{
public static final int NOF_ITERATIONS = 100000;
    static {
              System.loadLibrary("rtm_simple");
            }
    <blah blah blah>

    public static void main(String[] args) {
        SimpleJNITest simple = new SimpleJNITest();
        simple.text();
    }
}
公共类SimpleJNITest{
公共静态最终整数NOF_迭代次数=100000;
静止的{
系统加载库(“rtm_simple”);
}
公共静态void main(字符串[]args){
SimpleJNITest simple=新的SimpleJNITest();
simple.text();
}
}

@mko谢谢。但这一个使用的是
cc
,与我尝试遵循的教程相同。我使用的是
gcc
,而gcc没有
-G
标志。如果你读了我的帖子,你会注意到我已经尝试了你链接到的页面所建议的
-Djava.library.path
方式。@mko
错误:无法找到或加载主类recipeNo001.HelloWorld
我不想使用
系统。加载
,因为它需要绝对路径。但是,关于
lib
前缀,您是对的。因此,如果我更改
compile.sh
s.t.
soFile=“${libDir}/lib${cFileName}.so”
,它会工作。非常感谢。想要调整您的答案以更明确地包含此信息吗?很明显;)