情况:我有一个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
答案 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的专家,所以我可能无法进一步提供帮助。)