我正在声明一个内联本机JNI函数getId。我不确定如何告诉SWIG,在下面的%原生代码片段中,如何返回java.lang.Object。我现在有TBD。我相信typemap是正确的方法,但我不确定如何使用%native函数为本机JNI方法声明它。有任何想法吗?
%module Sample
%{
JNIEXPORT jobject JNICALL Java_com_test_SampleJNI_getID(JNIEnv *env, jclass cls)
{
jmethodID cnstrctr;
jvalue args[2];
jobject obj;
jbyteArray bArray;
bArray = (*env)->NewByteArray(env, 32);
(*env)->SetByteArrayRegion(env, bArray, 0, 32, (jbyte *)foo);
cls = (*env)->FindClass(env, "com/test/jni/DeviceId");
cnstrctr = (*env)->GetMethodID(env, cls, "<init>", "(ILjava/lang/String;[B)V");
args[0].i = (*env)->NewStringUTF(env, "id");
args[1].i = bArray;
obj = (*env)->NewObjectA(env, cls, cnstrctr, args);
return obj;
}
%}
%native(getID) TBD getID();
DeviceId.java:
package com.test.jni;
public class DeviceId {
private String id;
private byte[] cache;
public DeviceId(String id, byte[] cache){
this.id=id;
this.cache=cache;
}
public byte[] getCache() {
return cache;
}
public void setCache(byte[] cache) {
this.cache = cache;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
答案 0 :(得分:1)
你可以使用%native
的类型图(例如jtype和jstype),但如果你有一个jobject
并且已经处理了它,你也可以简单地说Object
你,例如:
%module Sample
%{
JNIEXPORT jobject JNICALL Java_com_test_SampleJNI_getID(JNIEnv *env, jclass cls)
{
jclass c = (*jenv)->FindClass(env, "java/lang/Object");
jmethodID m = (*jenv)->GetMethodID(env, c, "<init>", "()V");
return (*env)->NewObject(env, c, m);
}
%}
%native(getID) jobject getID();
如果你想返回别的东西(比如java.lang.Integer),你会做类似的事情:
%module Sample
%{
JNIEXPORT jobject JNICALL Java_com_test_SampleJNI_getID(JNIEnv *env, jclass cls)
{
jclass c = (*jenv)->FindClass(env, "java/lang/Integer");
jmethodID m = (*jenv)->GetMethodID(env, c, "<init>", "()V");
return (*env)->NewObject(env, c, m);
}
%}
%typemap(jstype) int getID "Integer"
%typemap(jtype) int getID "Integer"
%native(getID) int getID();
我在该typemap中明确指定了getID,以避免将其应用于所有int
。
(我测试了SWIG部分是生成合理的代码,但我没有验证JNI,它显然需要检查返回值)
您可以执行以下具体示例:
%typemap(jstype) DeviceID getID "com.test.jni.DeviceId"
%typemap(jtype) DeviceID getID "com.test.jni.DeviceId"
%typemap(javaout) DeviceID getID { return $jnicall; }
%native(getID) DeviceID getID();
即。你可以在字面上写下任何尚未用于其他东西的名称,只需应用一个类型图。
但最好用jobject
作为返回类型,然后你可以写:
%typemap(jstype) jobject getID "com.test.jni.DeviceId"
%typemap(jtype) jobject getID "com.test.jni.DeviceId"
%native(getID) jobject getID();