如何在MainActivity上调用ndk函数
问题描述:
我已经设法编译下面的代码,我想知道它是否正确,并且您给我举例说明如何在android的MainActivity中调用压缩函数。如何在MainActivity上调用ndk函数
#include <jni.h>
#include<Principal.h>
JNIEXPORT jint JNICALL
JAVA_com_pfc_camera_ndkmain_MainActivity_compresion(JNIEnv* env,jobjectArray
jargv){
//jargv is a Java array of Java strings
int argc = env->GetArrayLength(jargv);
typedef char *pchar;
pchar *argv = new pchar[argc];
int i;
for(i=0; i<argc; i++)
{
jstring js = (jstring)env->GetObjectArrayElement(jargv, i); //A Java string
const char *pjc = env->GetStringUTFChars(js,NULL); //A pointer to a Java-managed char buffer
size_t jslen = strlen(pjc);
argv[i] = new char[jslen+1]; //Extra char for the terminating null
strcpy(argv[i], pjc); //Copy to *our* buffer. We could omit that, but IMHO this is cleaner. Also, const correctness.
env->ReleaseStringUTFChars(js, pjc);
}
//Call main
Principal *pa=Principal::CreateInstance(argc,argv);
pa->Run();
pa->FreeInstance();
//main(argc, argv);
//Now free the array
for(i=0;i<argc;i++)
delete [] argv[i];
delete [] argv;
return 0;
}
答
您必须实现Java端来调用代码的C端。 但我认为你的C代码缺少jclass
说法。 您应该使用javah
创建包含本机功能的擦除.h文件。见documentation。
Java方面应该是这样的:
package com.pfc.camera.ndkmain;
public class MainActivity extends Activity {
native int compression(String[] argv);
public int foo(String[] args) {
return compression(args);
}
}
+0
如何使用JCLASS说法? – Gigasnike95
+0
通常你不使用它,除非你需要引用的C面你的java类或实例(见https://stackoverflow.com/questions/18861801/android-jni-method-is-the-second-parameter-jclass - 或jobject) – Xvolks
标题不匹配你问... –
对不起我的英语不是很好 – Gigasnike95