JNI:将C函数转换为Java样式函数

时间:2011-06-06 13:53:07

标签: java android c function pointers

背景

我正在使用将参数传递为指针的函数。我需要将用 C 编写的函数转换为 JAVA ,其行为与中的行为相同 C 即可。我正在 Windows Eclipse 中为 Android 进行开发>。

C函数示例

int testFunction( char* firstName, char* SecomdName, char* lastname, int age);

此函数指向 char 值的3个指针并初始化它们,因此在 C 中我可以写一些东西像下面这样初始化所有三个指针:

char* v1, v2, v3;
int res = testFunction(v1, v2, v3, 54);

调用testFunction后,变量v1, v2, v3将使用一些值进行初始化。

JAVA功能示例

int testFunction( String firstName, String secondName, String lastName, int age);

这与 C 中的功能相同,但用 JAVA 编写,但在 < em> JAVA 没有指针,这意味着我不能写这样的东西:

String v1, v2, v3;
testFunction(v1, v2, v3, 54);

问题:

如何为我的JAVA功能获得与C示例中相同的初始化行为?这可能吗?

4 个答案:

答案 0 :(得分:3)

你可以做一些事情。您可以创建一个包含要创建的字段的bean类,例如:

 public class Names {
     String firstName;
     String secondName;
     String lastName;
     int returnValue;

     // getters/constructors etc ommitted...
 }

然后,您的testFunction可以实例化一个Names对象并将其返回,即

 Names names = testFunction(int age);
 String firstName = names.getFirstName();
 // etc... 

另一种方法是,如果你正在处理字符串,则要传递StringBuilder对象,即

int testFunction(StringBuilder firstName, StringBuilder secondName, StringBuilder lastName, int age) {
   // Use StringBuilder methods such as append to create the strings eg...
   firstName.append("Bob");
}

然后在代码的其他地方你可以使用......

StringBuilder firstNameBuilder = new StringBuilder();
StringBuilder secondNameBuilder = new StringBuilder();
StringBuilder thirdNameBuilder = new StringBuilder();

testFunction(firstNameBuilder, secondNameBuilder, thirdNameBuilder, 84);

String firstName = firstNameBuilder.toString();  // firstName now equals "Bob"
/// etc...

答案 1 :(得分:2)

您必须应用“持有人”模式。粗略地说(我现在无法测试代码,但你会得到这个想法),你可以这样做:

class Holder <T>
{
  public T element;
  public T value() { return element; }
  public void setValue(T t ) { element = t; }
}

然后将代码更改为接受Holder<String>项。你的缺点是必须调用value()(或获取内部element),但这是我想到的更简单,更直接的方式(它也用于Java到IDL的映射) CORBA保留“out”引用。)

现在你可以这样做:

Holder<String> name = new Holder<String>();

int result = testFunction(name, ...);
System.out.println(name.value());

并且testFunction的实施是不可能的:

int testFunction(Holder<String> name, ...)
{
   name.setValue("whatever");
   // ...
}

答案 2 :(得分:2)

你必须做这样的事情:

public class Person {
    public String firstName;
    public String secondName;
    public String lastName;
}

int testFunction(Person person, int age) {
    ...
    // fill person fields
}

Person person = new Person();
int res = testFunction(person, 54);

答案 3 :(得分:1)

您可以让testFunction(...)返回一个包含三个(char基元/字符串对象)的Object。

public MyObject testFunction(v1,v1,v3,54) {
    //do initialization stuff...
    return new MyObject(v1, v2, v3, 54);
}

public class MyObject {
    MyObject(char v1, char v2, char v3, int number) {
        // something...
    }
}