传递字符串时JNI和Java命名约定是否重要

时间:2013-12-06 01:31:14

标签: java java-native-interface

情况:我有一个JNI文件库,该库由几个函数组成,这些函数由该JNI库中的主头文件调用(即code1.h)。我有一个Java文件(即code2.java),我想传递给JNI头文件(code1.h)。我为(code1.h)创建了一个名为(code1.c)的源代码。

我的问题是:(code1.h),(code1.c)和(code2.java)是否必须与JNI和java之间的通信相同?< / p>

编辑:所以(code1.h),(code1.c)和(code1.java)都必须是相同的名称,以便(code1.java)传递字符串to / from(code1.c)/(code1.h)?并且不可能让(code2.java)将字符串传递给/来自(code1.c)/(code1.h),因为它们的名称不相同,这是正确的吗?

例如,

public class code1 { /*this is code2.java, but should the name be changed to (code1.java) to match that of the JNI?*/
    static {
    System.loadLibrary("myjni"); 

}

将字符串传递给code1.h / code1.c

这将使用Linux Debian“Wheezy”和Eclipse与Android SDK和NDK编译为Android

2 个答案:

答案 0 :(得分:1)

虽然Java要求编译单元名称之间匹配(SomeClass.java是名称而public class SomeClass{是声明,但C不要求这样做。

只要函数名称/导出的符号名称与java端的本机方法名称匹配,您就可以根据需要命名C源文件和头文件。例如:

//JavaClass.java
public class JavaClass{
    public native String getAString(String in);
}

标题是:

// any name
JNIEXPORT jstring JNICALL 
Java_JavaClass_getAString(JNIEnv *, jobject, jstring);

匹配C文件。您可以为所有Java关注命名此标头catsMakeTheWorldGoRound.h

答案 1 :(得分:0)

以下是您的“JNI对象”应该是什么样子的示例。

//In my experience, it is better to put the JNI object into a separate package.
package org.example;
public class Code1
{
    static
    {
        // On a Linux system, the actual name of the library
        // is prefixed with "lib" and suffixed with ".so"
        // -- e.g. "myjni-java.so"
        // Windows looks for "myjni-java.dll"
        //
        // On a Windows system, we also need to load the prequisite
        // libraries first. (Linux loaders do this automatically).
        //
        String osname = System.getProperty("os.name");
        if (osname.indexOf("win") > -1 || osname.indexOf("Win") > -1)
        {
            System.loadLibrary("myjni");
        }
        System.loadLibrary("myjni-java");
    }

    // Now we declare the C functions which we will use in our Java code. 
    public static native void foo(int bar);

    public static native int bar(String foo);
    //...
}

鉴于您已正确编译了JNI库,您可以从其他Java类调用C函数,如下所示:

//Again, in my experience, it is better to explicitly give the package name here. 
org.example.Code1 Code1= new org.example.Code1();
Code1.foo(123);
int a= Code1.bar("Hello C function from Java function!");

这对您的问题有帮助吗? (我不是JNI的专家,所以我可能无法进一步提供帮助。)